Есть ли лучший и более быстрый способ копирования из памяти процессора в графический процессор с помощью тяги? - PullRequest
8 голосов
/ 21 февраля 2012

В последнее время я часто использую тяги.Я заметил, что для того, чтобы использовать Thrust, нужно всегда копировать данные из памяти процессора в память GPU.
Давайте посмотрим на следующий пример:

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

Я не совсем уверен, какконструктор host_vector работает, но кажется, что я копирую исходные данные, поступающие из *foo, дважды - один раз в host_vector, когда он инициализируется, и в другой раз, когда device_vector инициализируется.Есть ли лучший способ копирования из процессора в GPU без создания промежуточных копий данных?Я знаю, что могу использовать device_ptr в качестве оболочки, но это все равно не решит мою проблему.
спасибо!

1 Ответ

15 голосов
/ 21 февраля 2012

Один из конструкторов 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 не выделяет никакого хранилища;он просто кодирует местоположение указателя в системе типов.

...