1

我在带有 GPU GTX465 1 GB 的 MS VS2005 上使用 CUDA SDK 3.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() );
}

我正在循环中加载该函数的所有参数(例如,在一次循环迭代中每个参数有 4096 个元素)。总的来说,我想在所有循环迭代之后为每个参数制作 32768 个元素的内核。

MAX_FINAL_X 为 1920,MAX_FINAL_Y 为 1080。

当我开始算法时,第一次迭代非常快,经过一两次迭代后,我得到了有关 CUDA 超时错误的信息。我在 GPU gtx260 上使用了这个算法,据我记得它做得更好......

你能帮我..也许我在这个算法中根据新的费米拱门犯了一些错误?

4

3 回答 3

1

您的 GPU 是否连接到显示器?如果是这样,我相信默认情况下内核执行将在 5 秒后中止。您可以通过使用检查内核执行是否会超时cudaGetDeviceProperties- 请参阅参考页

于 2010-07-12T07:31:58.140 回答
1
  1. CUT_CHECK_ERROR之后 打电话会更好 cudaThreadSynchronize()。因为内核是异步运行的,你必须等待内核结束才能知道错误……也许在第二次迭代中,你会收到第一次内核使用的错误。
  2. 确保您在最有趣的变量中有一些有效数字 pointsNumber[0](这可能会导致很长的内部循环)。
  3. 您还可以提高内核函数的速度:
    • 使用更好的块​​。线程配置 20x20 会导致非常慢的内存使用(请参阅编程指南和最佳实践)。尝试使用 16x16 的块。
    • 不要使用pow(..., 2.0)函数。#define SQR(x) (x)*(x)使用 SQR 宏 ( )更快
    • 您不使用共享内存,因此__syncthreads()不是必需的。

PS:您还可以将值参数传递给 CUDA 函数,而不仅仅是指针。速度将是相同的。

PPS:请提高代码的可读性...现在您必须编辑六个位置来更改块配置...在内核内部您可以使用blockDim变量,您可以在 go2 函数中使用常量。您也可以使用bool firstTime- 那样会好得多float

于 2010-07-12T12:43:21.290 回答
1

在内核的循环中,您写入同一个数组,从中读取 - 对于全局内存使用,这是最糟糕的,因为来自不同块的扭曲相互等待。

于 2012-04-14T08:56:58.587 回答