比较CPU和GPU中内存范围的规范方法是什么



我必须有连续的范围(指针+大小(,一个在GPU中,一个位于CPU中,我想比较它们是否相等。

比较这些相等范围的规范方法是什么

my_cpu_type cpu;  // cpu.data() returns double*
my_gpu_type gpu;  // gpu.data() returns thrust::cuda::pointer<double>
thrust::equal(cpu.data(), cpu.data() + cpu.size(), gpu.data());

提供非法的内存访问。我也试过

thrust::equal(
thrust::cuda::par // also thrust::host
, cpu.data(), cpu.data() + cpu.size(), gpu.data()
);

在推力的一般情况下,你不能像想象的那样做。Thrust不在混合后端执行算法。您必须使用设备后端,在这种情况下,所有数据都需要在设备上(或可从设备代码中访问,请参阅下文(,或者使用主机后端,在那种情况下,需要所有数据都在主机上。

因此,您将被迫将数据从一侧复制到另一侧。成本应该相似(将主机阵列复制到设备,或将设备阵列复制到主机(,因此我们更喜欢复制到设备上,因为设备比较可以更快。

如果您可以将主机阵列放在固定缓冲区中,那么就可以执行您建议的操作。

对于一般情况,类似的东西应该起作用:

thrust::host_vector<double>   cpu(size);
thrust::device_vector<double> gpu(size);
thrust::device_vector<double> d_cpu = cpu;
bool are_equal = thrust::equal(d_cpu.begin(), d_cpu.end(), gpu.begin());

除了Robert的有效答案外,我还声称您在使用涉及GPU计算的C++-STL类代码时走错了路。

问题不仅仅在于指针指向哪里。像std::equal这样的东西本质上是顺序的。即使它的实现涉及并行性,假设仍然是计算,即尽快启动,阻塞调用线程,并将结果返回给调用线程以继续其工作。虽然这可能是你想要的,但我想在大多数情况下,这可能不是。我相信thrust的方法,让开发人员感觉他们在写";C++STL代码;(大部分(被误导了。

如果有一些GPU任务图、C++未来/异步/承诺机制的集成,也许还有像任务流或其他框架之类的东西,这可能会在某种程度上变得更像一个"框架";规范的";这样做的方法。

最新更新