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() );

.
.

}

私はNVidiaGeForce420Mを持っています。私はcudaが私のコンピューターでそれで動作することを確認しました。上記のコードをN=50000で実行すると、カーネルの起動に失敗し、「不特定のエラーメッセージ」というエラーメッセージが表示されます。ただし、10000などの小さい値では正常に機能するようです。

また、アルファ、ベータ、デルタ(コードのマーキングを参照)をコメントアウトし、ガンマのコメントを解除すると、コードは50000や100000などの大きな値のNでも機能します。

グローバルメモリの代わりにスレッドメモリを使用することでメモリトラフィックを削減するために、アルファとベータを使用したいと思います。

この問題を並べ替えるにはどうすればよいですか?

4

1 に答える 1

1

@mkuse。gridDimは、グリッド内のスレッドブロックの2D空間配置として視覚化でき、blockDimはスレッドの3D空間配置です。たとえば、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 に答える