Я прочитал два сообщения о переполнении стека, а именно функции ядра cubas автоматически синхронизируются с хостом? и CUDA Dynamic параллелизм; потоковую синхронизацию с устройства, и они рекомендуют использовать некоторые API синхронизации, например, cudaDeviceSynchronize()
после вызова функций cuBLAS. Я не уверен, что имеет смысл использовать такую функцию общего назначения.
Не лучше ли поступить следующим образом? [Поправьте меня если я ошибаюсь]:
cublasHandle_t cublas_handle;
cudaStream_t stream;
// Initialize the matrices
CUBLAS_CALL(
cublasDgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_N, M, M,
M, &alpha, d_A, M, d_B, M, &beta, d_C, M));
// cublasDgemm is non-blocking!
cublasGetStream(cublas_handle, &stream);
cudaStreamSynchronize(stream);
// Now it is safe to copy the result (d_C) from the device
// to the host and use it
С другой стороны, cudaDeviceSynchronize
можно использовать предпочтительно, если для выполнения параллельных операций cuBLAS использовалось множество потоков/дескрипторов. Каковы «лучшие методы» синхронизации дескрипторов cuBLAS? Можно ли рассматривать дескрипторы cuBLAS как обертки для потоков в том смысле, что они служат той же цели с точки зрения синхронизации?
cudaDeviceSynchronize
в целом замедляет выполнение, поэтому я подумал, что лучше этого избегать. Кроме того,cudaStreamSynchronize
сообщает устройству, что именно синхронизировать. Возможно, это не имеет никакого значения, я просто хотел узнать, как лучше всего распараллеливать операции cuBLAS. - person Pantelis Sopasakis   schedule 10.04.2014cudaStreamSynchronize( stream )
было недостаточно. Только когда мы сделали cudaDeviceSynchronize`, мы смогли получить стабильные результаты (никаких гонок после вызова Dgemm). Может быть, управляемая память требует полной синхронизации? - person alfC   schedule 02.05.2021