C++ CUDA cudaMemCpy不';尽管Cudat取得了成功,但他似乎没有复制

C++ CUDA cudaMemCpy不';尽管Cudat取得了成功,但他似乎没有复制,c++,cuda,C++,Cuda,我刚开始学习CUDA,这是我的第一个项目。我对这个问题进行了搜索,虽然我注意到其他人也有类似的问题,但这些建议似乎都与我的具体问题无关,也没有对我的情况有所帮助 作为练习,我正在尝试使用CUDA编写一个n体模拟。在这个阶段,我对我的具体实现是否有效不感兴趣,我只是在寻找一些有效的东西,我可以稍后对其进行改进。我还需要在代码运行后更新代码,以处理我的SLI配置 以下是该过程的简要概述: 创建X和Y位置、速度和加速度矢量 在GPU上创建相同的向量,并跨 在循环中:(i)计算迭代的加速度,(ii)将加

我刚开始学习CUDA,这是我的第一个项目。我对这个问题进行了搜索,虽然我注意到其他人也有类似的问题,但这些建议似乎都与我的具体问题无关,也没有对我的情况有所帮助

作为练习,我正在尝试使用CUDA编写一个n体模拟。在这个阶段,我对我的具体实现是否有效不感兴趣,我只是在寻找一些有效的东西,我可以稍后对其进行改进。我还需要在代码运行后更新代码,以处理我的SLI配置

以下是该过程的简要概述:

  • 创建X和Y位置、速度和加速度矢量
  • 在GPU上创建相同的向量,并跨
  • 在循环中:(i)计算迭代的加速度,(ii)将加速度应用于速度和位置,以及(iii)将位置复制回主机以供显示
  • (显示尚未实现。我将稍后执行此操作)

    现在不要担心加速度计算功能,这里是更新功能:

    __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的代码。谢谢你的建议。