Число производительности преобразования тяги

Может ли кто-нибудь сказать мне, что режимы тяги блокируют или не блокируют? Я хочу время, вот фрагменты кода-

фрагмент кода -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, но учтите, что

  1. clock() обычно реализуется с использованием источника времени низкого разрешения и, вероятно, не подходит для синхронизации этих типов операций. Вы должны найти таймер источника хоста с более высоким разрешением или, что еще лучше, использовать API событий CUDA для определения времени вашего кода. Вы можете увидеть пример использования этих API в этой паре вопрос-ответ.
  2. cudaThreadSynchronize является устаревшим API с версии CUDA 4.0. Вы должны использовать cudaDeviceSynchronize вместо.
Другие вопросы по тегам