C++ CUDA cudaMemCpy不';尽管Cudat取得了成功,但他似乎没有复制
我刚开始学习CUDA,这是我的第一个项目。我对这个问题进行了搜索,虽然我注意到其他人也有类似的问题,但这些建议似乎都与我的具体问题无关,也没有对我的情况有所帮助 作为练习,我正在尝试使用CUDA编写一个n体模拟。在这个阶段,我对我的具体实现是否有效不感兴趣,我只是在寻找一些有效的东西,我可以稍后对其进行改进。我还需要在代码运行后更新代码,以处理我的SLI配置 以下是该过程的简要概述:C++ CUDA cudaMemCpy不';尽管Cudat取得了成功,但他似乎没有复制,c++,cuda,C++,Cuda,我刚开始学习CUDA,这是我的第一个项目。我对这个问题进行了搜索,虽然我注意到其他人也有类似的问题,但这些建议似乎都与我的具体问题无关,也没有对我的情况有所帮助 作为练习,我正在尝试使用CUDA编写一个n体模拟。在这个阶段,我对我的具体实现是否有效不感兴趣,我只是在寻找一些有效的东西,我可以稍后对其进行改进。我还需要在代码运行后更新代码,以处理我的SLI配置 以下是该过程的简要概述: 创建X和Y位置、速度和加速度矢量 在GPU上创建相同的向量,并跨 在循环中:(i)计算迭代的加速度,(ii)将加
__global__ void apply_acc(double* pos_x, double* pos_y, double* vel_x, double* vel_y, double* acc_x, double* acc_y, int N)
{
int i = threadIdx.x;
if (i < N);
{
vel_x[i] += acc_x[i];
vel_y[i] += acc_y[i];
pos_x[i] += vel_x[i];
pos_y[i] += vel_y[i];
}
}
然后它仍然给出相同的值,因此没有调用apply\u acc
,或者cudaMemcpy
没有将数据复制回来
所有cudamaloc
和cudaMemcpy
调用返回cudascucess
是指向完整代码的PasteBin链接。这应该是相当简单的遵循,因为有很多重复的各种数组
正如我所说,我以前从未编写过CUDA代码,我是根据NVidia的#2 CUDA示例视频编写的,在该视频中,该人编写了并行阵列加法代码。我不确定这是否有什么不同,但我正在使用2x GTX970与最新的NVidia驱动程序和CUDA 7.0 RC,并且我选择在安装CUDA时不安装捆绑驱动程序,因为它们比我之前的版本旧。这不起作用:
const int N = 100000;
...
calc_acc<<<1, N>>>(...);
apply_acc<<<1, N>>>(...);
const int N=100000;
...
会计科目(…);
应用_acc(…);
内核启动配置的第二个参数(
)是threads per block参数。它被限制为512或1024,具体取决于编译方式。这些内核将不会启动,需要使用correct捕获由此产生的错误类型。仅查看后续CUDA API函数的返回值并不表示存在此类错误(这就是为什么您随后会看到cudaSuccess
)
关于这个概念本身,我建议你了解更多。要启动大量线程,需要使用内核启动配置的两个参数(即前两个参数中的niether应为1)。从性能角度来看,这通常也是可取的。这不起作用:
const int N = 100000;
...
calc_acc<<<1, N>>>(...);
apply_acc<<<1, N>>>(...);
const int N=100000;
...
会计科目(…);
应用_acc(…);
内核启动配置的第二个参数(
)是threads per block参数。它被限制为512或1024,具体取决于编译方式。这些内核将不会启动,需要使用correct捕获由此产生的错误类型。仅查看后续CUDA API函数的返回值并不表示存在此类错误(这就是为什么您随后会看到cudaSuccess
)
关于这个概念本身,我建议你了解更多。要启动大量线程,需要使用内核启动配置的两个参数(即前两个参数中的niether应为1)。从性能角度来看,这通常也是可取的。这不起作用:
const int N = 100000;
...
calc_acc<<<1, N>>>(...);
apply_acc<<<1, N>>>(...);
const int N=100000;
...
会计科目(…);
应用_acc(…);
内核启动配置的第二个参数(
)是threads per block参数。它被限制为512或1024,具体取决于编译方式。这些内核将不会启动,需要使用correct捕获由此产生的错误类型。仅查看后续CUDA API函数的返回值并不表示存在此类错误(这就是为什么您随后会看到cudaSuccess
)
关于这个概念本身,我建议你了解更多。要启动大量线程,需要使用内核启动配置的两个参数(即前两个参数中的niether应为1)。从性能角度来看,这通常也是可取的。这不起作用:
const int N = 100000;
...
calc_acc<<<1, N>>>(...);
apply_acc<<<1, N>>>(...);
const int N=100000;
...
会计科目(…);
应用_acc(…);
内核启动配置的第二个参数(
)是threads per block参数。它被限制为512或1024,具体取决于编译方式。这些内核将不会启动,需要使用correct捕获由此产生的错误类型。仅查看后续CUDA API函数的返回值并不表示存在此类错误(这就是为什么您随后会看到cudaSuccess
)
关于这个概念本身,我建议你了解更多。要启动大量线程,需要使用内核启动配置的两个参数(即前两个参数中的niether应为1)。从性能角度来看,这通常也是可取的。好的,谢谢。目前,我将把N限制在512,并确保它有效,然后我将更新任意大N的代码。谢谢你的建议。好的,谢谢。目前,我将把N限制在512,并确保它有效,然后我将更新任意大N的代码。谢谢你的建议。好的,谢谢。目前,我将把N限制在512,并确保它有效,然后我将更新任意大N的代码。谢谢你的建议。好的,谢谢。目前,我将N限制为512,并确保它工作正常,然后我将更新任意大N的代码。谢谢你的建议。