繁体   English   中英

在 CPU 和 GPU 中比较 memory 范围的规范方法是什么

[英]What is the canonical way to compare memory ranges in the CPU and in the 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());

提供非法的 memory 访问权限。 我也试过

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());

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

问题不仅仅是指针指向哪里的问题。 std::equal这样的东西本质上是顺序的。 即使它的实现涉及并行性,假设仍然是一个计算,即尽快启动,阻塞调用线程,并将结果返回给调用线程以继续其工作。 虽然这可能就是您想要的,但我猜想在大多数情况下,它可能不是。 我认为 thrust 的方法让开发人员觉得他们正在编写“C++ STL 代码,但使用 GPU”(大部分)是错误的。

如果集成了 GPU 任务图、 C++未来/异步/承诺机制,也许还有类似任务流或其他框架的东西,那可能会以某种方式成为更“规范”的方式来做到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM