c++ thrust::reduce_by_key()返回重复的键

mrphzbgm  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(202)

下面是我的代码:

//initialize the device_vector
int size = N;
thrust::device_vector<glm::vec3> value(size);
thrust::device_vector<int> key(size);
//get the device pointer of the device_vector
//so than I can write data to the device_vector in CUDA kernel
glm::vec3 * dv_value_ptr = thrust::raw_pointer_cast(&value[0]);
int* dv_key_ptr = thrust::raw_pointer_cast(&key[0]);
//run the kernel function
dim3 threads(16, 16);
dim3 blocks(iDivUp(m_width, threads.x), iDivUp(m_height, threads.y));
//the size of value and key is packed in dev_data
compute_one_i_all_j <<<blocks, threads >>>(dev_data, dv_key_ptr, dv_value_ptr);
//Finally, reduce the vector by its keys.
thrust::pair<thrust::device_vector<int>::iterator,
      thrust::device_vector<glm::vec3>::iterator> new_last;
new_last = thrust::reduce_by_key(key.begin(), key.end(), value.begin(), output_key.begin(), output_value.begin());
//get the reduced vector size
int new__size = new_last.first - output_key.begin();

完成所有这些代码后,我将output_key写入一个文件。我在文件中得到了许多重复的密钥,如下所示:

reduce_by_key()似乎不起作用。
PS. CUDA内核只写入key s和value s的一部分,因此在内核之后,keyvalue中的一些元素保持不变(可能为0)。

qpgpyjmq

qpgpyjmq1#

如文件所述:
对于[keys_first, keys_last)范围内相等的每组连续键,reduce_by_key将该组的第一个元素复制到keys_output。使用加号减少范围中的相应值,并将结果复制到values_output。
每一组相等的 * 连续的 * 键将被减少。
所以首先你必须重新排列你所有的键和值,这样所有键相等的元素都是相邻的。最简单的方法是使用sort_by_key

thrust::sort_by_key(key.begin(), key.end(), value.begin())
new_last = thrust::reduce_by_key(key.begin(), key.end(), value.begin(), output_key.begin(), output_value.begin());

相关问题