2012-02-21 5 views
7

В последнее время я много использую тягу. Я заметил, что для использования тяги необходимо всегда копировать данные из памяти процессора в память gpu.
Давайте посмотрим на следующий пример:есть лучший и быстрый способ скопировать из памяти процессора на 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 в качестве обертки, но это все еще не устраняет мою проблему.
спасибо!

ответ

14

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

+0

аргумент size_t n указывает количество элементов в векторе и не должно быть в имени типа size_t, size_t обычно указывает длину данных в байтах. – TripleS