У меня есть код Cuda C++, который использует Thrust, который в настоящее время работает правильно на одном графическом процессоре. Теперь я хотел бы изменить его для multi-gpu. У меня есть функция хоста, которая включает в себя ряд вызовов Thrust, которые сортируют, копируют, вычисляют различия и т. Д. На массивах устройств. Я хочу использовать каждый графический процессор для выполнения этой последовательности вызовов Thrust на своем собственном (независимом) наборе массивов одновременно. Я прочитал, что функции Thrust, возвращающие значения, являются синхронными, но я могу использовать OpenMP для того, чтобы каждый поток хоста вызывал функцию (с вызовами Thrust), которая запускается на отдельном графическом процессоре?Multi-gpu CUDA Thrust
Например (закодирован в браузере):
#pragma omp parallel for
for (int dev=0; dev<Ndev; dev++){
cudaSetDevice(dev);
runthrustfunctions(dev);
}
void runthrustfunctions(int dev){
/*lots of Thrust functions running on device arrays stored on corresponding GPU*/
//for example this is just a few of the lines"
thrust::device_ptr<double> pos_ptr = thrust::device_pointer_cast(particle[dev].pos);
thrust::device_ptr<int> list_ptr = thrust::device_pointer_cast(particle[dev].list);
thrust::sequence(list_ptr,list_ptr+length);
thrust::sort_by_key(pos_ptr, pos_ptr+length,list_ptr);
thrust::device_vector<double> temp(length);
thrust::gather(list_ptr,list_ptr+length,pos_ptr,temp.begin());
thrust::copy(temp.begin(), temp.end(), pos_ptr);
} `
Я думаю, что также необходима структура "частицы [0]", чтобы быть сохранены на GPU 0, частица [1] на GPU 1 и т. Д., И я думаю, это невозможно. Опцией может быть использование «switch» с отдельным кодом для каждого случая GPU.
Я хотел бы знать, является ли это правильным подходом или есть лучший способ? Спасибо
Почему вам необходимо установить устройство из различных потоков хозяевах? Не могли бы вы использовать пример так же просто, как в [Многоразовый графический процессор с CUDA Thrust] (http://stackoverflow.com/questions/16885971/multi-gpu-usage-with-cuda-thrust)? – JackOLantern
Предположительно, как метод, чтобы обойти тот факт, что некоторые операции осечки блокируют поток хоста. –