MPI + CUDA AWARE, параллельные ядра и MPI_Sendrecv

Во время моей работы я обнаружил небольшую проблему. Сейчас я использую MVAPICH-GDR-2.05 и Open MPI 1.7.4 с CUDA 6.0.

Я работаю над обменом несмежными элементами между графическими процессорами (например, столбцами матрицы) и пытаюсь запустить два ядра (одно для разброса и одно для сбора) и связь с MPI_Sendrecv между двумя графическими процессорами одновременно.

Я использовал профилировщик CUDA (nvprof), чтобы увидеть, что делает моя программа, и я видел странные вещи:

  • В Open MPI 1.7.4 у меня 3 потока cuda работают одновременно.
  • С MVAPICH-gdr-2.05 у меня есть два одновременно работающих ядра и MPI_Sendrecv не совпадает с ними.

Ты знаешь почему MPI_Sendrecv в MVAPICH это делает?

Это мой псевдокод:

// creation and initialization of streams
cudaStream_t stream1, stream2;
cudaStreamCreateWithFlags( stream1, cudaStreamNonBlocking )
cudaStreamCreateWithFlags( stream2, cudaStreamNonBlocking )

///////////////////////////////////////////////////////////////////

// 1) --> gather of the first chunk
gather_kernel <<< dimGrid, dimBlock, 0, stream1 >>> ( ... )
cudaStreamSynchronize(stream1)

// 2) --> gather of the second chunk
//    --> communication of the first chunk
gather_kernel <<< dimGrid, dimBlock, 0, stream1 >>> ( ... )
MPI_Sendrecv( ... )
cudaStreamSynchronize(stream1)

// 3) --> scatter of the chunk (ii)
//    --> gather of the chunk (ii+2)
//    --> communication of the chunk (ii+1)
// K is the number of chunk
for ( ii=0; ii<K-2; ii++ ){
    scatter_kernel <<< dimGrid, dimBlock, 0, stream2 >>> ( ... )
    gather_kernel  <<< dimGrid, dimBlock, 0, stream1 >>> ( ... )
    MPI_Sendrecv( ... )
    cudaStreamSynchronize(stream2)
    cudaStreamSynchronize(stream1)
}

// 4) --> scatter of the penultimate chunk
//    --> communication of the last chunk
scatter_kernel <<< dimGrid, dimBlock, 0, stream2 >>> ( ... )
MPI_Sendrecv( ... )
cudaStreamSynchronize(stream2)

// 5) --> scatter of the last chunk
scatter_kernel <<< dimGrid, dimBlock, 0, stream2 >>> ( ... )
cudaStreamSynchronize(stream2)

И вот скриншот двух профилировщиков:

0 ответов

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