这是我的代码。我有一个 (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 来通过更多地使用线程内存而不是全局内存来减少内存流量。
我如何对这个问题进行排序?