gpu-cluster-system & performance test
DESCRIPTION
Tesla K20 4枚を搭載したマシン4台で構成された、16GPUのXeonクラスタでのGPU性能検証結果などについて紹介します. "CUDA Aware MPI"機能を使用した場合と使用しない場合でのデータ転送速度の比較やサンプルコードとして姫野ベンチでの測定結果など、ご参考になるのでは思っております.TRANSCRIPT
GPUクラスタシステムの性能検証について
株式会社オー・ティ・ビー
2014/01
はじめに
Tesla K20 4枚を搭載したマシン4台で構成された、16GPUの当社製クラスタでのGPU性能検証結果などについて紹介します.
CPU 2x Intel(R) Xeon(R) CPU E5-2687W v2 @ 3.40GHz 8core
メモリ 64GB DDR3-1600
HDD
マスタ機:SAS HDD 1TB(15000rpm)スレーブ機:SATA HDD 500GB* I/Oの高速性と 冗長性の確保のため、マスタ機にはSASカードを
追加して1TB SAS HDDを使用
GPU4x Tesla K20PCI-Express 2.0 X16 にて接続
インターコネクトFDR Infiniband (56Gbps)Infinibandハブ経由で各ノードを接続
CUDA CUDA 5.5、Driver version 331.20
MPI OpenMPI 1.7.3
1ノードあたりのハードウェア構成
2014/01
MPIバンド幅の測定
FDR InfinibandとOpenMPI 1.7.3によるノード間のデータ転送速度の測定
・ホストからホスト
・GPUからGPU (CUDA Aware MPI)
ノード1
CPU
CPU
GPU
GPU
GPU
GPU
ノード2
CPU
CPUHost to Host
GPU
GPU
GPU
GPU
Device to Device
2014/01
MPIバンド幅の測定
2014/01
CUDA Aware MPICUDA Aware MPIを使用した場合と使用しない場合でのMPI_Send,MPI_Recvのデータ転送速度の測定
(1) CUDA Aware MPI(2) No CUDA Aware MPI (ホストメモリはpage-locked : cudaMallocHost)(3) No CUDA Aware MPI (ホストメモリはnot page-locked : malloc)
cudaMemcpy(r_dev_prt, r_host_ptr, size * sizeof(int), cudaMemcpyHostToDevice);
ノード1
ノード2
ノード1
ノード2
MPI_Recv(r_dev_ptr, size, MPI_INT, dest, 100, MPI_COMM_WORLD, status);
デバイスポインタ
CUDA Aware MPIMPI_Send(s_dev_ptr, size, MPI_INT, dest, 100, MPI_COMM_WORLD);
No CUDA Aware MPIcudaMemcpy(s_host_ptr, s_dev_ptr, size * sizeof(int), cudaMemcpyDeviceToHost);MPI_Send(s_host_ptr, size, MPI_INT, dest, 130, MPI_COMM_WORLD, request);
MPI_Recv(r_host_ptr, size, MPI_INT, dest, 130, MPI_COMM_WORLD, request);
2014/01
MPIバンド幅の測定
データサイズが大きい場合はCUDA Aware MPIが高い性能
2014/01
MPI姫野ベンチのCUDA化・ MPI,Cの姫野ベンチマークのCUDA化
・ なるべくCPUコードを変更しないような簡単なCUDA化のみとしており配列サイズの調整、チューニング、カーネルとデータ転送のオーバーラップなどは行わない.
主な追加・修正点
1. プロセス間のデータ転送部分の簡略化
2. CUDAによるデバイスメモリの割り当て・解放、データ転送
3. 反復計算のCUDAカーネル化
4. MPI通信
2014/01
MPI姫野ベンチのCUDA化1. プロセス間のデータ転送部分の簡略化
計算領域の分割はI方向のみに限定
=> データ転送時に配列要素が不連続な配列要素が現れない
2. デバイスメモリの割り当て・解放、データ転送
CUDA APIによるデバイスメモリの割り当てなどを追加
プロセス間通信のためのホストメモリの確保
// デバイスメモリの確保cudaMalloc((void **)&p_d, arrsize * sizeof(float));・・・// MPI通信に使うホストメモリ確保float *send_buf_u, *recv_buf_u, *send_buf_l, *recv_buf_l;cudaMallocHost( (void**) &send_buf_u, sizeof(float)*MKMAX*MJMAX);
//初期値のホストからデバイスへの転送cudaMemcpy(p_d, p, arrsize * sizeof(float), cudaMemcpyHostToDevice);・・・MPI_Barrier(MPI_COMM_WORLD);
2014/01
MPI姫野ベンチのCUDA化3. CUDAカーネル化
関数jacobiではCUDAカーネルの呼び出しやMPI関数など追加
CUDAカーネルは配列wrk2、変数ssの計算部分と配列pの更新部分を分けて実装
CUDA GridはK,J方向に関する2次元で構成し、カーネル内でI方向の反復計算
__global__ void jacobi_kernel ( int imax, int jmax, int kmax, float *p_d, float *a_d,float *b_d, float *c_d, float *wrk1_d, float *wrk2_d, float *bnd_d,float *reduce_tmp, float omega)
{float s0, ss;float tmp_t = 0;int k = blockIdx.x * blockDim.x + threadIdx.x;int j = blockIdx.y * blockDim.y + threadIdx.y;int i;if ( j == 0 ) goto __end;if ( k == 0 ) goto __end;if ( j >= jmax - 1 ) goto __end;if ( k >= kmax - 1 ) goto __end;
for ( i = 1 ; i < imax - 1 ; i++){s0 = a_d[IDX_COEF(0,i,j,k)] * p_d[IDX(i+1,j ,k )]
+ a_d[IDX_COEF(1,i,j,k)] * p_d[IDX(i ,j+1,k)]・・・
2014/01
MPI姫野ベンチのCUDA化4. MPI通信
CUDAでデバイス-ホスト間、MPIでホスト-ホスト間と別々にデータ転送
領域分割をI方向のみに限定しているので、データ転送時に不連続なメモリ領域が含まれない
if ( ndx > 1) {if ( npx[0] != -2) cudaMemcpy(&send_buf_l[0], &p_d[IDX(1,0,0)], jkplane,
cudaMemcpyDeviceToHost);if ( npx[1] != -2) cudaMemcpy(&send_buf_u[0], &p_d[IDX(imax-2,0,0)], jkplane,
cudaMemcpyDeviceToHost);MPI_Status st[4];MPI_Request req[4];MPI_Barrier(MPI_COMM_WORLD);
MPI_Irecv(&recv_buf_u[0], MJMAX * MKMAX, MPI_FLOAT, npx[1], 1, mpi_comm_cart, req);MPI_Irecv(&recv_buf_l[0], MJMAX * MKMAX, MPI_FLOAT, npx[0], 2, mpi_comm_cart, req+1);
MPI_Isend(&send_buf_l[0], MJMAX * MKMAX, MPI_FLOAT, npx[0], 1, mpi_comm_cart, req+2);MPI_Isend(&send_buf_u[0], MJMAX * MKMAX, MPI_FLOAT, npx[1], 2, mpi_comm_cart, req+3);
MPI_Waitall(4, req, st);
if( npx[1] != -2) cudaMemcpy(&p_d[IDX(imax-1,0,0)], &recv_buf_u[0], jkplane,cudaMemcpyHostToDevice);
if( npx[0] != -2) cudaMemcpy(&p_d[IDX(0,0,0)], &recv_buf_l[0], jkplane,cudaMemcpyHostToDevice);
}
2014/01
16 GPUs543 Gflops
64 CPUs143 Gflops
MPI姫野ベンチのCUDA化
メモリサイズやアライメント調整、カーネルチューニング、カーネルとデータ転送のオーバーラップなど、CPUやGPUコードをさらに変更することにより性能は大きく向上する
簡単なCUDAポーティングのみでも4ノードで3.8倍高速化
2014/01
当社ではGPUやXeon Phiなど最新のHPC向けのメニコア並列計算機の販売を行っております.各種サーバー・クラスタなどお客様の用途に合わせてカスタマイズいたしますのでお気軽にご相談ください.
株式会社オー・ティ・ビー
http://www.otb-japan.co.jp/