使用推力将部分数据集复制到多个CUDA GPU

时间:2015-06-16 19:00:24

标签: c++ cuda thrust

我想在多个GPU之间拆分数据集,每个GPU只使用Thrust接收CUDA代码的数据子集。附件是下面的代码,编译;但是,推力在运行时给出了以下错误“在抛出'thrust :: system :: system_error'的实例后调用终止 what():无效的参数 中止“

如何仅将推力复制作为范围的一部分并注意整个范围?

// find number of GPU's
int GPU_N, i;
cudaGetDeviceCount(&GPU_N);

//Subdividing input data across GPUs
//Get data sizes for each GPU
for (i = 0; i < GPU_N; i++)
{
    number_gpu[i] = Np / GPU_N;
}

//Take into account "odd" data sizes
for (i = 0; i < Np % GPU_N; i++)
{
    number_gpu[i]++;
}

for(i = 0; i < GPU_N; i++){
    cudaSetDevice(i);

thrust::device_vector<ARRAYTYPE> dev_pos(3*number_gpu[i]);
thrust::device_vector<ARRAYTYPE> dev_vel(3*number_gpu[i]);
thrust::device_vector<ARRAYTYPE> dev_accel(3*number_gpu[i]);
thrust::device_vector<ARRAYTYPE> dev_time(number_gpu[i]);

thrust::copy_n(pPos.begin()+3*number_gpu[i], 3*number_gpu[i+1], dev_pos.begin());
thrust::copy_n(pVel.begin()+3*number_gpu[i], 3*number_gpu[i+1], dev_vel.begin());
thrust::copy_n(pAccel.begin()+3*number_gpu[i], 3*number_gpu[i+1], dev_accel.begin());
thrust::copy_n(pTime.begin()+number_gpu[i], 3*number_gpu[i+1], dev_time.begin());

谢谢!

2 个答案:

答案 0 :(得分:2)

您应该提供MCVE,而不是部分代码段。对于类似这样的问题,请expects that(&#34;为什么这段代码无效?&#34;)。

但是,我发现至少有两个问题。

  1. 这对我来说不正确:
  2. 此:

    thrust::device_vector<ARRAYTYPE> dev_pos(3*number_gpu[i]);
    

    在设备上分配&#34;在dev_pos向量3*number_gpu[i]中存储大小为ARRAYTYPE&#34的<{1}}元素;

    此:

    thrust::copy_n(pPos.begin()+3*number_gpu[i], 3*number_gpu[i+1], dev_pos.begin());
    

    说&#34;从3*number_gpu[i+1]开始复制nPos.begin()+3*number_gpu[i]元素到dev_pos

    我们已经看到dev_pos3*number_gpu[i]元素分配了存储空间。您现在想要将3*number_gpu[i+1]元素复制到其中。这看起来并不正确,而且如果3*number_gpu[i+1] > 3*number_gpu[i]它会成为一个问题。

    thrust::copy_n的第二个参数是要复制的元素数量。您可以查看documentation on thrust::copy_n

    要解决此问题,您可能只需要更改第二个参数:

    thrust::copy_n(pPos.begin()+3*number_gpu[i], 3*number_gpu[i], dev_pos.begin());
    

    和其他情况类似。

    1. 这看起来也不正确:
    2. 下面:

      thrust::device_vector<ARRAYTYPE> dev_time(number_gpu[i]);
      

      您已为number_gpu[i]元素分配了空间。

      下面:

      thrust::copy_n(pTime.begin()+number_gpu[i], 3*number_gpu[i+1], dev_time.begin());
      

      您正在尝试将3*number_gpu[i+1]元素复制到其中。这可能太大了,看起来像是复制粘贴错误。

      同样,要修复,您可能只需要更改第二个参数:

      thrust::copy_n(pTime.begin()+number_gpu[i], number_gpu[i], dev_time.begin());
      

      如果没有解决问题,那么您需要提供MCVE。这是一个完整但很短的代码,可以证明这个问题。它需要是其他人可以复制,粘贴,编译和运行的东西,而不必添加任何内容或更改任何内容,并查看问题。

答案 1 :(得分:0)

感谢您的帮助,我现在看到我做错了什么。这是代码的工作版本。

CookieManager cookieManager = CookieManager.getInstance()