如何在不隐式调用“复制”的情况下初始化 CUDA 推力向量?

Posted

技术标签:

【中文标题】如何在不隐式调用“复制”的情况下初始化 CUDA 推力向量?【英文标题】:How to initialise CUDA Thrust vector without implicitly invoking 'copy'? 【发布时间】:2012-12-28 23:41:56 【问题描述】:

我有一个指针int *h_a,它引用了我想复制到设备的大量数据点N(在主机上)。所以我这样做:

thrust::host_vector<int> ht_a(h_a, h_a + N);
thrust::device_vector<int> dt_a = ht_a;

但是,创建ht_a 似乎暗示复制 h_a 而不是引用它,这是低效的,因为我不需要h_a 的另一个副本。

我只想创建ht_a 以使&amp;ht_a[0] 指向h_a[0] - 怎么做?

非常感谢。

另外,由于除了复制到设备内存之外,我实际上并没有对 ht_a 做任何事情,我很想知道我们是否可以直接在 int*thrust::device_vector&lt;int&gt; 之间切换。 em>

【问题讨论】:

是的,您可以直接从两个 int*s 初始化 device_vector,就像您在示例中对 host_vector 所做的那样。 【参考方案1】:

编辑的代码还显示了如何从设备复制回主机:

#include <stdio.h>
#include <thrust/device_vector.h>
#include <thrust/copy.h>

int main() 

 int N = 10;
 int *h_a;
 int *h_b;
 h_a = (int *)malloc(N*sizeof(int));
 h_b = (int *)malloc(N*sizeof(int));
 for (int i=0; i<N; i++) 
   h_a[i] = i;
   h_b[i] = 0;
   

 thrust::device_vector<int> dt_a(h_a, h_a + N);

 thrust::copy(dt_a.begin(), dt_a.end(), h_b);

 for (int i=0; i<N; i++)
   printf("h_b[%d] = %d\n", i, h_b[i]);
 return 0;

【讨论】:

谢谢,但是我该如何从dt_a 回到h_a(即thrust::device_vector&lt;int&gt; 到主机int*)? 谢谢。这些操作是同步的吗? 是的,我上面显示的所有推力复制操作都是同步的(dt_a 创建时的隐式复制和没有执行策略的显式thrust::copy)。意思是在函数完成之前控制权不会返回给宿主线程 malloc 在 C++ 代码中??即使在 2013 年,new 也是要走的路……(现在是std::unique_ptr。)顺便说一句内存泄漏。

以上是关于如何在不隐式调用“复制”的情况下初始化 CUDA 推力向量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不调用渲染函数的情况下访问 Context 的值? [复制]

TypeScript:删除索引签名而不隐式出现“任何”类型错误

如何在不从表单中删除数据的情况下重置 BootstrapValidator? [复制]

Ubuntu 14.04如何在不安装nvidia驱动的情况下安装cuda 6.5

如何在不登录的情况下从 Instagram 获取 oauth 2 访问令牌(隐式流程)?

如何在不为每条记录调用发送方法的情况下在 Kafka Avro 生产者中发送对象的 ArrayList? [复制]