+ All Categories
Home > Technology > GPU-Cluster-System & Performance TEST

GPU-Cluster-System & Performance TEST

Date post: 27-Jun-2015
Category:
Upload: otb
View: 751 times
Download: 0 times
Share this document with a friend
Description:
Tesla K20 4枚を搭載したマシン4台で構成された、16GPUのXeonクラスタでのGPU性能検証結果などについて紹介します. "CUDA Aware MPI"機能を使用した場合と使用しない場合でのデータ転送速度の比較やサンプルコードとして姫野ベンチでの測定結果など、ご参考になるのでは思っております.
Popular Tags:
12
GPUクラスタシステムの 性能検証について 株式会社オー・ティ・ビー
Transcript
Page 1: GPU-Cluster-System & Performance TEST

GPUクラスタシステムの性能検証について

株式会社オー・ティ・ビー

Page 2: GPU-Cluster-System & Performance TEST

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ノードあたりのハードウェア構成

Page 3: GPU-Cluster-System & Performance TEST

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

Page 4: GPU-Cluster-System & Performance TEST

2014/01

MPIバンド幅の測定

Page 5: GPU-Cluster-System & Performance TEST

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);

Page 6: GPU-Cluster-System & Performance TEST

2014/01

MPIバンド幅の測定

データサイズが大きい場合はCUDA Aware MPIが高い性能

Page 7: GPU-Cluster-System & Performance TEST

2014/01

MPI姫野ベンチのCUDA化・ MPI,Cの姫野ベンチマークのCUDA化

・ なるべくCPUコードを変更しないような簡単なCUDA化のみとしており配列サイズの調整、チューニング、カーネルとデータ転送のオーバーラップなどは行わない.

主な追加・修正点

1. プロセス間のデータ転送部分の簡略化

2. CUDAによるデバイスメモリの割り当て・解放、データ転送

3. 反復計算のCUDAカーネル化

4. MPI通信

Page 8: GPU-Cluster-System & Performance TEST

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);

Page 9: GPU-Cluster-System & Performance TEST

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)]・・・

Page 10: GPU-Cluster-System & Performance TEST

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);

}

Page 11: GPU-Cluster-System & Performance TEST

2014/01

16 GPUs543 Gflops

64 CPUs143 Gflops

MPI姫野ベンチのCUDA化

メモリサイズやアライメント調整、カーネルチューニング、カーネルとデータ転送のオーバーラップなど、CPUやGPUコードをさらに変更することにより性能は大きく向上する

簡単なCUDAポーティングのみでも4ノードで3.8倍高速化

Page 12: GPU-Cluster-System & Performance TEST

2014/01

当社ではGPUやXeon Phiなど最新のHPC向けのメニコア並列計算機の販売を行っております.各種サーバー・クラスタなどお客様の用途に合わせてカスタマイズいたしますのでお気軽にご相談ください.

株式会社オー・ティ・ビー

http://www.otb-japan.co.jp/


Recommended