c++ - 如何使用CUDA以正确的方式在C++项目和C++中的DLL之间传输数据?

标签 c++ arrays performance dll cuda

我有一个 C++ 项目,它在 C++ 中使用 DLL 和 CUDA。

现在我将 2 个指针从主项目传递到 DLL。在 DLL 内部,数组将被复制到设备内存。将用它们进行一些计算。然后,数组将被复制回主机。

听说采用数据重叠方式,数据传输会更好。但在这种情况下我该怎么办呢?复制函数 cudaMemcpyAsync 要求固定内存是异步的,而传递的指针则不是,对吧?

我使用的临时解决方案是使用 memcpy 将传递的数组复制到固定数组。然后,我使用流来重叠数据。之后,再次使用memcpy从固定内存数组复制到传递数组。我认为 CPU 的东西显然不是一个好方法。

当两者都使用 CUDA 时,我们可以做一些事情,例如将固定内存数组从主项目传递到 DLL 吗?

提前非常感谢。

最佳答案

标准 C/C++ 分配器(即 mallocnew)分配的内存可以通过使用 CUDA 运行时函数 cudaHostRegister 转换为页锁定内存。 ,可用于重叠主机和设备之间的异步内存复制。被告知;不要忘记取消使用上述功能固定的内存。使用cudaHostUnregister取消固定内存。如果内存没有被解除固定,可能会产生不希望的结果。例如函数可能会尝试固定已经固定的内存。或固定内存可以使用freedelete来释放,这是未定义的行为。

关于c++ - 如何使用CUDA以正确的方式在C++项目和C++中的DLL之间传输数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20539538/

相关文章:

c++ - 如何在 C++ 代码中包装 C 二维数组 (Foo**)?

c++ - 不同类的虚函数共享相同的(无效的?)内存地址

c++ - 是否可以在不使用 virtual 关键字的情况下调用(同名)子函数?

C 简单数组代码不起作用

c++ - 在没有首先显式调用析构函数的情况下在旧对象上使用 placement new 是否危险?

javascript - Jquery 在解析时将巨大的数组拆分为许多新的回调

javascript - PHP 和 Ajax 在回调和返回数组中使用 foreach 循环

c# - 悖论 : Why is yield return faster than list here

c++ - C++ 中的快速 CSV 解析器

javascript - Firefox 重绘非常慢(5 秒)