关于推力 remove_if 的问题

问题描述

我有一些关于如何使用推力的 remove_if 的重要问题

  1. 我们如何知道删除了多少元素或新数组的大小(删除元素后)?例如,如果我有一个 6 元素数组

    int thearray[6] = {1,2,1,3};

然后我删除 0

int *new_end = thrust::remove_if(A,A + N,is_zero());

我应该得到 {1,3} 但我怎么知道结果有 4 个元素?

  1. 我尝试使用

    thrust::remove_if(d_data,d_data+6,is_zero<int>());

其中 d_dataint * d_data; 但内存分配在设备内存中(使用 cudamalloc 但它给出了分段错误。这通常发生在尝试从主机访问设备内存时. 所以这让我想到。我试图将每个操作都保留在设备内存中(最后只是下载到主机)。推力::remove_if 是否首先将数据下载到主机?

编辑: 在这

int * d_data;
cudamalloc((void**)&d_data,6 * sizeof(int));
cudamemcpy(d_data,h_data,6 * sizeof(int),cudamemcpyHostToDevice);

thrust::device_ptr<int> dev_ptr(d_data);

thrust::remove_if(dev_ptr,dev_ptr+6,is_zero<int>());
//thrust::remove_if(d_data,is_zero<int>());  //--> segmentation fault

你可以看到我用 d_data 包裹了 device_ptr。如果我这样做,它可以正常工作,但是如果我尝试在 d_data 本身上使用 remove_if,它会崩溃

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)