0

这是我的代码。我有一个 (x,y) 对数组。我想为每个坐标计算最远点。

#define GPUERRCHK(ans) { gpuAssert((ans), __FILE__, __LINE__); }
inline void gpuAssert(cudaError_t code, char *file, int line, bool abort=true)
{
   if (code != cudaSuccess)
   {
      fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
      if (abort) exit(code);
   }
}

__device__ float computeDist( float x1, float y1, float x2, float y2 )
{
    float delx = x2 - x1;
    float dely = y2 - y1;
    return sqrt( delx*delx + dely*dely );
}

__global__ void kernel( float * x, float * y, float * dev_dist_sum, int N )
{
    int tid = blockIdx.x*gridDim.x + threadIdx.x;
    float a = x[tid];  //............(alpha)
    float b = y[tid];  //............(beta)
    if( tid < N )
    {
    float maxDist = -1;
    for( int k=0 ; k<N ; k++ )
    {
        //float dist = computeDist( x[tid], y[tid], x[k], y[k] ); //....(gamma)
        float dist = computeDist( a, b, x[k], y[k] );             //....(delta)
        if( dist > maxDist )
        maxDist = dist; 
    }
    dev_dist_sum[tid] = maxDist;
    }
}

int main()
{
.
.

    kernel<<<(N+31)/32,32>>>( dev_x, dev_y, dev_dist_sum, N );
    GPUERRCHK( cudaPeekAtLastError() );
    GPUERRCHK( cudaDeviceSynchronize() );

.
.

}

我有一个 NVidia GeForce 420M。我已经验证 cuda 在我的计算机上可以使用它。当我为 N = 50000 运行上述代码时,内核无法启动并抛出错误消息“未指定的错误消息”。但是,对于像 10000 这样的较小值,它似乎可以正常工作。

此外,如果我注释掉 alpha、beta、delta(请参阅代码中的标记)并取消注释 gamma,则该代码甚至适用于较大的 N 值,例如 50000 或 100000。

我想使用 alpha 和 beta 来通过更多地使用线程内存而不是全局内存来减少内存流量。

我如何对这个问题进行排序?

4

1 回答 1

1

@mkuse。gridDim 可以可视化为网格中线程块的 2-D 空间排列,而 blockDim 是线程的 3-D 空间排列。例如,dim3 gridDim(2,3,1) 表示 x 方向有 2 个线程块,y 方向有 3 个线程块。您可以达到的最大值是 65536 = 2^16。dim3 blockDim(32,16,1) 处于线程粒度。x 方向 32 个线程,y 方向 16 个线程,总共 512 个线程。您可以使用线程 ID 访问每个线程。但是,由于您有多个块,因此您必须使用各自的 blockdims 和 griddims 来识别线程。

于 2013-02-02T21:12:26.477 回答