我有关于如何使用推力的 remove_if 的重要问题
我们如何知道删除了多少元素或新数组的大小(一旦元素被删除)?例如,如果我有一个 6 元素数组
int thearray[6] = {1, 0, 2, 0, 1, 3};
我删除了 0
int *new_end = thrust::remove_if(A, A + N, is_zero());
我应该得到{1,2,1,3} ,但我怎么知道结果有 4 个元素?
我试着用
thrust::remove_if(d_data, d_data+6, is_zero<int>());
哪里d_data是int * d_data;但在设备内存中分配了内存(cudaMalloc 但它给出了分段错误。这通常发生在尝试从主机访问设备内存时。所以这让我思考。我试图将每个操作保留在设备内存中(最后只是下载到主机).thrust::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, d_data+6, is_zero<int>()); //--> segmentation fault
你可以看到我d_data用device_ptr. 如果我这样做,它可以正常工作,但是如果我尝试对其d_data自身使用 remove_if ,它会崩溃