有没有更好更快的方法来使用推力从 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<T>::size()
最终返回 size_t
的机会很大。见std::size_t
'以上是关于有没有更好更快的方法来使用推力从 CPU 内存复制到 GPU?的主要内容,如果未能解决你的问题,请参考以下文章
有没有一种有效的方法来使用正则表达式从 HTML 字符串中提取数据? [复制]
有没有更好的方法来使用 jQuery 创建一个面向对象的类?