Как заставить несколько 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.

Другие вопросы по тегам