Вызовы Thrust, которые вызывают ядра, являются асинхронными, как и базовые API-интерфейсы CUDA.Вызовы Thrust, которые копируют данные, являются синхронными, точно так же, как используются базовые API-интерфейсы CUDA.
Таким образом, ваш пример будет измерять только издержки при запуске ядра и установке на стороне хоста, а не саму операцию.Для определения времени вы можете обойти это, вызвав либо cudaThreadSynchronize
, либо cudaDeviceSynchronize
(позже в CUDA 4.0 или позже) после запуска ядра тяги.В качестве альтернативы, если вы включите операцию копирования после запуска ядра и запишете время остановки после этого, ваше время будет включать настройку, выполнение и время копирования.
В вашем примере это будет выглядеть примерно так:
start = clock();//Start
thrust::sort(D.begin(),D.end());
cudaThreadSynchronize(); // block until kernel is finished
diff = ( clock() - start ) / (double)CLOCKS_PER_SEC;
std::cout << "\nDevice Time taken is: " <<diff<<std::endl;