Cuda 推力::按_键减少_()似乎不起作用

Cuda 推力::按_键减少_()似乎不起作用,cuda,thrust,Cuda,Thrust,这是我的密码: //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

这是我的密码:

//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();
//初始化设备\u向量
int size=N;
推力:装置的矢量值(尺寸);
推力:设备_矢量键(尺寸);
//获取设备向量的设备指针
//这样我就可以将数据写入CUDA内核中的设备_向量
glm::vec3*dv_value_ptr=推力::原始指针_强制转换(&value[0]);
int*dv_key_ptr=thrust::raw_pointer_cast(&key[0]);
//运行内核函数
dim3螺纹(16,16);
dim3块(iDivUp(m_宽度,threads.x),iDivUp(m_高度,threads.y));
//值和键的大小打包在dev_数据中
计算所有数据(开发数据、dv密钥、dv值);
//最后,通过关键点减少向量。
推力:最后配对新的_;
new_last=推力::按_键减少_(key.begin(),key.end(),value.begin(),output_key.begin(),output_value.begin());
//得到缩减的向量大小
int new_uuusize=new_last.first-output_key.begin();
完成所有这些代码后,我将输出密钥写入一个文件。我在文件中获得了如此多的重复密钥,如下所示:

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

如文档中所述:

对于范围
[第一个键,最后一个键)
中相等的每组连续键,
reduce\u by\u key
将组中的第一个元素复制到keys\u输出。使用加号减少范围中的相应值,并将结果复制到values\u输出

每组相等的连续关键点将减少

因此,首先必须重新排列所有键和值,使所有键相等的元素相邻。最简单的方法是使用
sort\u by\u 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());

键序列必须是连续的。如果输入中的键不相邻,则输出中完全可能有重复的键。我已投票结束此问题。因此:“寻求调试帮助的问题”(“此代码为什么不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现问题所需的最短代码。没有明确问题说明的问题对其他读者没有用处。”