这是我的代码。我有一组(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,以便通过使用线程内存而不是全局内存来减少内存流量。
如何排序此问题?
答案 0 :(得分: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来标识线程。