c++ - Cuda 三重嵌套 for 循环赋值

标签 c++ for-loop cuda nested-loops

我正在尝试将 C++ 代码转换为 Cuda 代码,并且我有以下三重嵌套 for 循环,它将填充一个数组以进一步进行 OpenGL 渲染(我只是创建一个坐标顶点数组):

for(int z=0;z<263;z++) {                    
       for(int y=0;y<170;y++) {
           for(int x=0;x<170;x++) {
               g_vertex_buffer_data_3[i]=(float)x+0.5f;
               g_vertex_buffer_data_3[i+1]=(float)y+0.5f;
               g_vertex_buffer_data_3[i+2]=-(float)z+0.5f; 
               i+=3;            
           }
       }
   }

我希望获得更快的操作,因此我将使用 Cuda 进行一些操作,例如上面列出的操作。我想为最外层循环的每次迭代创建一个 block ,并且由于内部循环的迭代次数为 170 * 170 = 28900 次,因此为每个最内层循环迭代分配一个线程。我将 C++ 代码转换成这个(这只是我为了解如何使用 Cuda 而编写的一个小程序):

__global__ void mykernel(int k, float *buffer) {
int idz=blockIdx.x;
int idx=threadIdx.x;
int idy=threadIdx.y;

buffer[k]=idx+0.5;
buffer[k+1]=idy+0.5;
buffer[k+2]=idz+0.5;
k+=3;

}

int main(void) {
  int dim=3*170*170*263;
  float* g_vertex_buffer_data_2 = new float[dim];
  float* g_vertex_buffer_data_3;
  int i=0;

  HANDLE_ERROR(cudaMalloc((void**)&g_vertex_buffer_data_3, sizeof(float)*dim));

  dim3 dimBlock(170, 170);

  dim3 dimGrid(263);

  mykernel<<<dimGrid, dimBlock>>>(i, g_vertex_buffer_data_3);

  HANDLE_ERROR(cudaMemcpy(&g_vertex_buffer_data_2,g_vertex_buffer_data_3,sizeof(float)*dim,cudaMemcpyDeviceToHost));

  for(int j=0;j<100;j++){
    printf("g_vertex_buffer_data_2[%d]=%f\n",j,g_vertex_buffer_data_2[j]);
  }
  cudaFree(g_vertex_buffer_data_3);

  return 0;

}

尝试启动它时出现段错误。你知道我做错了什么吗? 我认为问题在于 threadIdx.x 和 threadIdx.y 同时增长,而我希望 threadIdx.x 成为内部的而 threadIdx.y 成为外部的。

最佳答案

这里有很多错误,但是段错误的来源是这样的:

cudaMemcpy(&g_vertex_buffer_data_2,g_vertex_buffer_data_3,
                sizeof(float)*dim,cudaMemcpyDeviceToHost);

你要么想要

cudaMemcpy(&g_vertex_buffer_data_2[0],g_vertex_buffer_data_3,
                sizeof(float)*dim,cudaMemcpyDeviceToHost);

cudaMemcpy(g_vertex_buffer_data_2,g_vertex_buffer_data_3,
                sizeof(float)*dim,cudaMemcpyDeviceToHost);

修复后,您会注意到内核实际上从未启动并出现无效启动错误。这是因为 (170,170) 的 block 大小是非法的。 CUDA 在所有当前硬件上都有每个 block 1024 个线程的限制。

您的代码中很可能还有其他问题。找到这两个后我就不再找了。

关于c++ - Cuda 三重嵌套 for 循环赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38097435/

相关文章:

c++ - g++ (freebsd) 错误 : expected primary-expression before '{' token

c++ - 不可预测的线程行为

cuda - 表面内存比全局内存花费更多时间(两倍)

python - 如何在 django 模板中设置页面范围的索引

arrays - Go 中的嵌套循环数组的行为不像其他语言的数组

c++ - Cuda 全局 __device__ 变量自动初始化

c++ - NVCC 尝试链接不必要的对象

c++ - 您能否像在 C# 中那样在 C++ 中显式设置结构布局/对齐方式?

c++ - 您如何跟踪应用程序内存泄漏?

c++11 - 开始/结束成员变量和基于范围的 for 循环