我想在多个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());
谢谢!
答案 0 :(得分:2)
您应该提供MCVE,而不是部分代码段。对于类似这样的问题,请expects that(&#34;为什么这段代码无效?&#34;)。
但是,我发现至少有两个问题。
此:
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_pos
为3*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());
和其他情况类似。
下面:
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()