微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于推力 remove_if 的问题

如何解决关于推力 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 举报,一经查实,本站将立刻删除。