给定以下一段代码,使用推力(CUDA 的 C++ 模板库)生成一种带有 CUDA 的代码字典:
thrust::device_vector<float> dCodes(codes->begin(), codes->end());
thrust::device_vector<int> dCounts(counts->begin(), counts->end());
thrust::device_vector<int> newCounts(counts->size());
for (int i = 0; i < dCodes.size(); i++) {
float code = dCodes[i];
int count = thrust::count(dCodes.begin(), dCodes.end(), code);
newCounts[i] = dCounts[i] + count;
//Had we already a count in one of the last runs?
if (dCounts[i] > 0) {
newCounts[i]--;
}
//Remove
thrust::detail::normal_iterator<thrust::device_ptr<float> > newEnd = thrust::remove(dCodes.begin()+i+1, dCodes.end(), code);
int dist = thrust::distance(dCodes.begin(), newEnd);
dCodes.resize(dist);
newCounts.resize(dist);
}
codes->resize(dCodes.size());
counts->resize(newCounts.size());
thrust::copy(dCodes.begin(), dCodes.end(), codes->begin());
thrust::copy(newCounts.begin(), newCounts.end(), counts->begin());
问题是,通过使用 CUDA 视觉分析器,我注意到了 4 个字节的多个副本。IMO 这是由
- 循环计数器i
- 浮点代码、整数计数和分布
- 每次访问i和上面提到的变量
这似乎减慢了一切(连续复制 4 个字节并不好玩......)。
那么,我如何告诉推力,这些变量应在设备上处理?还是他们已经?
使用推力::device_ptr 对我来说似乎还不够,因为我不确定 for 循环是在主机上还是在设备上运行(这也可能是运行缓慢的另一个原因)。