Как инициализировать вектор CUDA Thrust без неявного вызова «копирования»?

У меня есть указатель 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 так, чтобы &ht_a[0] указывало на h_a[0] — как это сделать?

Большое спасибо.

В качестве альтернативы, поскольку я на самом деле ничего не делаю с ht_a, кроме копирования в память устройства, мне было бы интересно узнать, можем ли мы перейти напрямую между int* и thrust::device_vector<int>.


person mchen    schedule 14.01.2013    source источник
comment
Да, вы можете инициализировать device_vector напрямую из двух int* точно так же, как вы делали это с host_vector в своем примере.   -  person Jared Hoberock    schedule 15.01.2013


Ответы (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;
}
person Robert Crovella    schedule 14.01.2013
comment
Спасибо, но как мне вернуться с dt_a на h_a (т.е. с thrust::device_vector<int> на хост int*)? - person mchen; 15.01.2013
comment
Спасибо. Являются ли эти операции синхронными? - person mchen; 15.01.2013
comment
Да, все показанные выше операции принудительного копирования являются синхронными (как неявное копирование при создании dt_a, так и явное thrust::copy без политики выполнения). Это означает, что управление не возвращается к хост-потоку, пока функция не будет завершена. - person Robert Crovella; 11.06.2015
comment
malloc в коде C++?? Даже в 2013 году new был путь.. (сейчас это было бы std::unique_ptr.) Кстати, утечка памяти. - person JHBonarius; 17.06.2018