0

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

  1. 我们如何知道删除了多少元素或新数组的大小(一旦元素被删除)?例如,如果我有一个 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 个元素?

  1. 我试着用

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

哪里d_dataint * 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_datadevice_ptr. 如果我这样做,它可以正常工作,但是如果我尝试对其d_data自身使用 remove_if ,它会崩溃

4

0 回答 0