Как заставить несколько API-интерфейсов CUBLAS (например, cublasDgemm) действительно выполняться одновременно в нескольких cudaStream
Я хочу, чтобы два API-интерфейса CUBLAS (например,.cublasDgemm) действительно выполнялись одновременно в двух cudaStreams.
Как мы знаем, API CUBLAS является асинхронным, подпрограммы уровня 3, такие как cublasDgemm, не блокируют хост, это означает, что следующие коды (по умолчанию cudaStream) будут выполняться одновременно:
cublasDgemm();
cublasDgemm();
НО, когда я профилирую программу с помощью "NVIDIA Visual Profiler", это показывает, что они работают нормально.
Затем я пытаюсь связать их с разными cudaStreams, псевдокод выглядит так:
// Create a stream for every DGEMM operation
cudaStream_t *streams = (cudaStream_t *) malloc(batch_count*sizeof(cudaStream_t));
for(i=0; i<batch_count; i++)
cudaStreamCreate(&streams[i]);
// Set matrix coefficients
double alpha = 1.0;
double beta = 1.0;
// Launch each DGEMM operation in own CUDA stream
for(i=0; i<batch_count; i++){
// Set CUDA stream
cublasSetStream(handle, streams[i]);
// DGEMM: C = alpha*A*B + beta*C
cublasDgemm(handle,
CUBLAS_OP_N, CUBLAS_OP_N,
dim, dim, dim,
&alpha,
d_A[i], dim,
d_B[i], dim,
&beta,
d_C[i], dim);
}
Когда batch_count=5, результат, показанный "NVIDIA Visual Profiler":
Multi-CublasDegmm Rountines Результат выполнения с несколькими потоками
Результат показывает, что они все еще работают по порядку. Как сделать так, чтобы multi cublas apis действительно запускался одновременно в нескольких cudaStreams, например так:
У кого-нибудь есть идеи? Благодарю.
1 ответ
Во-первых, спасибо за комментарии @Robert Crovella.
Согласно помощи @Robert Crovella и моим исследованиям, мы можем запускать несколько API-интерфейсов CUBLAS (например, cublasDgemm) одновременно в некоторых особых случаях, но в большинстве случаев это невозможно.
Случай 1: Когда я выполняю cublasDgemm с большими значениями dim (m=n=k=1024*8) на K40, профилировщик показывает результат следующим образом: cublasDgemm с значениями dim (M=N=K=1024*8)
Случай 2: Когда я выполняю cublasDgemm с небольшими значениями dim (m=n=k=64) на K40, профилировщик показывает результат следующим образом: cublasDgemm с значениями dims (M=N=K=64)
Случай 3: НО, когда я выполняю cublasDgemm с dims (m=n=k=256) на K40, профилировщик показывает результат следующим образом: cublasDgemm с dims из (M=N=K=256)
Из результатов CASE 1 и CASE 2 видно, что мы не можем, не только с большими значениями dim, но и с небольшими значениями dim, запускать API-интерфейсы CUBLAS одновременно. Причина для случая 1 состоит в том, что ресурсы gpu были использованы, поэтому не осталось места для запуска других подпрограмм, а для случая 2 - задержка запуска двух ядер, из-за которой трудно увидеть con.