
[英]is there a better and a faster way to copy from CPU memory to GPU using thrust?
[英]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.