GPU GTX4651GBを搭載したMSVS2005でCUDASDK3.1を使用しています。私はそのようなカーネル関数を持っています:
__global__ void CRT_GPU_2(float *A, float *X, float *Y, float *Z, float *pIntensity, float *firstTime, float *pointsNumber)
{
int holo_x = blockIdx.x*20 + threadIdx.x;
int holo_y = blockIdx.y*20 + threadIdx.y;
float k=2.0f*3.14f/0.000000054f;
if (firstTime[0]==1.0f)
{
pIntensity[holo_x+holo_y*MAX_FINAL_X]=0.0f;
}
for (int i=0; i<pointsNumber[0]; i++)
{
pIntensity[holo_x+holo_y*MAX_FINAL_X]=pIntensity[holo_x+holo_y*MAX_FINAL_X]+A[i]*cosf(k*sqrtf(pow(holo_x-X[i],2.0f)+pow(holo_y-Y[i],2.0f)+pow(Z[i],2.0f)));
}
__syncthreads();
}
これはカーネル関数を呼び出す関数です。
extern "C" void go2(float *pDATA, float *X, float *Y, float *Z, float *pIntensity, float *firstTime, float *pointsNumber)
{
dim3 blockGridRows(MAX_FINAL_X/20,MAX_FINAL_Y/20);
dim3 threadBlockRows(20, 20);
CRT_GPU_2<<<blockGridRows, threadBlockRows>>>(pDATA, X, Y, Z, pIntensity,firstTime, pointsNumber);
CUT_CHECK_ERROR("multiplyNumbersGPU() execution failed\n");
CUDA_SAFE_CALL( cudaThreadSynchronize() );
}
この関数のすべてのパラメーターをループでロードしています(たとえば、1回のループ反復でパラメーターごとに4096個の要素)。合計すると、すべてのループの反復後に、各パラメーターの32768要素に対してこのカーネルを作成したいと思います。
MAX_FINAL_Xは1920で、MAX_FINAL_Yは1080です。
alghoritmを開始すると、最初の反復が非常に速くなり、さらに1〜2回反復すると、CUDAタイムアウトエラーに関する情報が得られます。私はGPUgtx260でこのアルゴリズムを使用しましたが、覚えている限りではうまくいっていました...
私を助けてくれませんか..このアルゴリズムの新しいFermiアーチによると、私はいくつかの間違いをしているのでしょうか?