я неоднократно епдиеие последовательность ядер:Действительно ли sort_by_key вызывает блокирующий вызов?
for 1..100:
for 1..10000:
// Enqueue GPU kernels
Kernel 1 - update each element of array
Kernel 2 - sort array
Kernel 3 - operate on array
end
// run some CPU code
output "Waiting for GPU to finish"
// copy from device to host
cudaMemcpy ... D2H(array)
end
Ядро 3 имеет порядок O (N^2), так что на сегодняшний день самым медленным из всех. Для ядра 2 я использую упорную :: sort_by_key непосредственно на устройстве:
thrust::device_ptr<unsigned int> key(dKey);
thrust::device_ptr<unsigned int> value(dValue);
thrust::sort_by_key(key,key+N,value);
кажется, что этот призыв к тяги блокировки, так как код CPU только получает выполняется один раз внутренний цикл завершен. Я вижу это, потому что, если я удалю вызов до sort_by_key
, код хоста (правильно) выводит строку «Ожидание» до завершения внутреннего цикла, в то время как он не работает, если я запускаю сортировку.
Есть ли способ позвонить thrust::sort_by_key
асинхронно?
Привет, Роберт, спасибо! Я не знал о детеныше. Теперь я могу предварительно выделить временное хранилище. Это _might_ даже может привести к увеличению производительности, хотя, вероятно, не так много. Размер очереди будет проблемой, которую я не рассматривал. Интересно, есть ли способ запросить максимальный размер очереди устройства ... – Gaberoo
Я не верю, что есть способ запросить размер очереди (или доступное количество слотов). Насколько я знаю, это не опубликованное количество. Нетрудно написать программу, чтобы узнать, что это (по крайней мере приблизительно), если вы так склонны. Однако это может измениться с устройства на устройство или даже с версии CUDA на версию CUDA. –