有没有更好更快的方法来使用推力从 CPU 内存复制到 GPU?

Posted

技术标签:

【中文标题】有没有更好更快的方法来使用推力从 CPU 内存复制到 GPU?【英文标题】:is there a better and a faster way to copy from CPU memory to GPU using thrust? 【发布时间】:2012-03-11 12:30:28 【问题描述】:

最近我一直在使用推力。我注意到,为了使用推力,必须始终将数据从 cpu 内存复制到 gpu 内存。 让我们看看下面的例子:

int foo(int *foo)

     host_vector<int> m(foo, foo+ 100000);
     device_vector<int> s = m;

我不太确定 host_vector 构造函数是如何工作的,但似乎我正在复制来自 *foo 的初始数据,两次 - 一次是在初始化时复制到 host_vector,另一次是device_vector 已初始化。有没有更好的方法可以在不制作中间数据副本的情况下从 cpu 复制到 gpu?我知道我可以使用 device_ptr 作为包装器,但这仍然不能解决我的问题。 谢谢!

【问题讨论】:

【参考方案1】:

device_vector 的构造函数之一采用由两个迭代器指定的一系列元素。理解示例中的原始指针足够聪明,因此您可以直接构造 device_vector 并避免临时的 host_vector

void my_function_taking_host_ptr(int *raw_ptr, size_t n)

  // device_vector assumes raw_ptrs point to system memory
  thrust::device_vector<int> vec(raw_ptr, raw_ptr + n);

  ...

如果您的原始指针指向 CUDA 内存,请引入 device_ptr

void my_function_taking_cuda_ptr(int *raw_ptr, size_t n)

  // wrap raw_ptr before passing to device_vector
  thrust::device_ptr<int> d_ptr(raw_ptr);

  thrust::device_vector<int> vec(d_ptr, d_ptr + n);

  ...

使用device_ptr 不会分配任何存储空间;它只是对类型系统中指针的位置进行编码。

【讨论】:

参数size_t n指定向量中的元素个数,不应该是size_t类型名称,size_t通常以字节为单位指定数据长度。 这是一个奇怪的评论。 size_t 是指定事物的大小。 thrust::device_vector&lt;T&gt;::size() 最终返回 size_t 的机会很大。见std::size_t'

以上是关于有没有更好更快的方法来使用推力从 CPU 内存复制到 GPU?的主要内容,如果未能解决你的问题,请参考以下文章

有没有更快的方法来使用多个多边形来掩盖多个栅格?

有没有一种有效的方法来使用正则表达式从 HTML 字符串中提取数据? [复制]

有没有更好的方法来使用 jQuery 创建一个面向对象的类?

有没有更好的方法来使用 Youtube PHP API

有没有更好的方法来使用 PowerShell 实现服务的开/关

推力::主机向量和标准::向量有啥区别?