Число производительности преобразования тяги
Может ли кто-нибудь сказать мне, что режимы тяги блокируют или не блокируют? Я хочу время, вот фрагменты кода-
фрагмент кода -1:
clock_t start,end;
start = clock();
thrust::transform( a.begin(), a.end(), b.begin(), thrust::negate<int>());
end = clock();
фрагмент кода - 2
clock_t start,end;
start = clock();
thrust::transform( a.begin(), a.end(), b.begin(), thrust::negate<int>());
cudaThreadSynchronize();
end = clock();
фрагмент кода -1 занимает гораздо меньше времени по сравнению с фрагментом кода -2, почему это происходит? и какой из них является правильным способом определения времени подпрограмм тяги, чтобы я мог сравнить его с моим параллельным кодом.
1 ответ
Я не верю, что Thrust формально определяет, какие API блокируют, а какие неблокируют где-либо в документации. Тем не менее, вызов transform, как в вашем примере, должен выполняться в одной внутренней операции закрытия (которая преобразуется в один вызов ядра без копий данных хост-устройства) и должен быть асинхронным.
Ваш второй фрагмент кода ближе к правильному времени выполнения операции Thrust, но учтите, что
clock()
обычно реализуется с использованием источника времени низкого разрешения и, вероятно, не подходит для синхронизации этих типов операций. Вы должны найти таймер источника хоста с более высоким разрешением или, что еще лучше, использовать API событий CUDA для определения времени вашего кода. Вы можете увидеть пример использования этих API в этой паре вопрос-ответ.cudaThreadSynchronize
является устаревшим API с версии CUDA 4.0. Вы должны использоватьcudaDeviceSynchronize
вместо.