C++ 用于循环分配的Cuda三重嵌套

C++ 用于循环分配的Cuda三重嵌套,c++,for-loop,cuda,nested-loops,C++,For Loop,Cuda,Nested Loops,我试图将C++代码转换为CUDA代码,我得到了下面的三重嵌套循环,它将填充一个数组,用于进一步OpenGL渲染(我只是创建一个坐标顶点数组): 对于(int z=0;z这里有很多错误,但SEGFULT的来源如下: cudaMemcpy(&g_vertex_buffer_data_2,g_vertex_buffer_data_3, sizeof(float)*dim,cudaMemcpyDeviceToHost); 你要么想要 cudaMemcpy(&am

我试图将C++代码转换为CUDA代码,我得到了下面的三重嵌套循环,它将填充一个数组,用于进一步OpenGL渲染(我只是创建一个坐标顶点数组):


对于(int z=0;z这里有很多错误,但SEGFULT的来源如下:

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

一旦修复,您将注意到内核实际上从未以无效启动错误启动。这是因为
(170170)
的块大小是非法的。CUDA在所有当前硬件上的每个块限制为1024个线程


您的代码中可能还有其他问题。在发现这两个问题后,我停止了查找。

这里有很多错误,但segfault的来源如下:

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

一旦修复,您将注意到内核实际上从未以无效启动错误启动。这是因为
(170170)
的块大小是非法的。CUDA在所有当前硬件上的每个块限制为1024个线程


您的代码中可能还有其他问题。在找到这两个问题后,我停止了查找。

我编辑了第一件事,谢谢!现在我尝试使用第二件事,我必须找到正确的方法来设置每个网格的块数和每个块的线程数。对于我的三重嵌套循环,我应该使用threadsId和blockId作为g_vertex_buffer_d的索引吗ata_3还是我应该使用在每个循环中增加的不同索引?与其使用如此大的数据集,您可以从较小的数据集开始,以解决其他问题,例如:k+=3没有达到预期效果,测试缓冲区溢出和g_vertex_buffer_data_2泄漏。之后,您可以将整个数据集划分为我会多次调用你的CUDA内核,来解决HW限制。但是首先让逻辑正确。非常感谢!我怎么能用CUDA来做K+=3?我是说,我如何告诉CUDA做C++中的k+=3?@尼科尔。科格诺:请不要在它已经被回答之后修改你的问题。这不是你的个人帮助线程。这是一个问题。我回答了这个问题,你现在已经换成了其他的问题。这不是怎么回事。如果你有不同的问题(看起来你有)问一个新问题。我编辑了第一件事,谢谢!现在我尝试第二件事,我必须找到正确的方法来设置每个网格的块数和每个块的线程数。对于我的三重嵌套循环,我应该使用threadsId和blockId作为g_vertex_buffer_data_3的索引,还是应该使用在每个循环中增加的不同索引使用如此大的数据集,您可以从一个较小的数据集开始,以解决其他问题,例如:k+=3没有达到预期效果,测试缓冲区溢出和g_vertex_buffer_data_2泄漏。之后,您可以对整个数据集进行分区,并多次调用CUDA内核,以解决硬件限制。但是首先,得到正确的逻辑。非常感谢!我怎么能用CUDA来做K+=3?我是说,我怎么告诉CUDA做C++中的k+=3?@尼科尔。科格诺:请不要在它已经被回答之后修改你的问题。这不是你的个人帮助线程。这是一个问题。我回答了,你现在已经变成了别的东西。这不是。这不是怎么回事。如果你有一个不同的问题(看起来你有),问一个新问题。,
cudaMemcpy(g_vertex_buffer_data_2,g_vertex_buffer_data_3,
                sizeof(float)*dim,cudaMemcpyDeviceToHost);