如何在不隐式调用“copy”的情况下初始化CUDA Thrust向量?

5

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

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,使得&ht_a[0]指向h_a[0] - 如何做到这一点?

非常感谢。

或者,由于我实际上除了将其复制到设备内存之外没有对ht_a做任何事情,我想知道是否可以直接在int*thrust::device_vector<int>之间进行转换。


1
是的,您可以像在示例中使用host_vector一样直接从两个int *初始化device_vector - Jared Hoberock
1个回答

5

编辑代码,还可以显示如何从设备复制回主机:

#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 <int>返回到主机int *)? - mchen
谢谢。这些操作是同步的吗? - mchen
是的,我展示的所有推力复制操作都是同步的(包括在创建dt_a时的隐式复制和没有执行策略的显式thrust::copy)。这意味着直到函数完成,控制权才会返回主机线程。 - Robert Crovella
C++代码中的malloc??即使在2013年,使用new也是正确的方法。(现在应该使用std::unique_ptr。)顺便提一下,这可能会导致内存泄漏。 - JHBonarius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接