これが私のコードです。(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() );
.
.
}
私はNVidiaGeForce420Mを持っています。私はcudaが私のコンピューターでそれで動作することを確認しました。上記のコードをN=50000で実行すると、カーネルの起動に失敗し、「不特定のエラーメッセージ」というエラーメッセージが表示されます。ただし、10000などの小さい値では正常に機能するようです。
また、アルファ、ベータ、デルタ(コードのマーキングを参照)をコメントアウトし、ガンマのコメントを解除すると、コードは50000や100000などの大きな値のNでも機能します。
グローバルメモリの代わりにスレッドメモリを使用することでメモリトラフィックを削減するために、アルファとベータを使用したいと思います。
この問題を並べ替えるにはどうすればよいですか?