CUDA:GPU 1へのメモリコピーがマルチGPUで遅くなります
-
23-09-2019 - |
質問
私の会社は2 GTX 295のセットアップ、そのサーバーで4つのGPUの合計を持っている、と我々はいくつかのサーバを持っています。 私は、問題の原因を見つけることはほとんど速度テストを書いたように、我々はGPU 1、特にGPU 0、2及び3と比較して、時間がかかりました。
//#include <stdio.h>
//#include <stdlib.h>
//#include <cuda_runtime.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cutil.h>
__global__ void test_kernel(float *d_data) {
int tid = blockDim.x*blockIdx.x + threadIdx.x;
for (int i=0;i<10000;++i) {
d_data[tid] = float(i*2.2);
d_data[tid] += 3.3;
}
}
int main(int argc, char* argv[])
{
int deviceCount;
cudaGetDeviceCount(&deviceCount);
int device = 0; //SELECT GPU HERE
cudaSetDevice(device);
cudaEvent_t start, stop;
unsigned int num_vals = 200000000;
float *h_data = new float[num_vals];
for (int i=0;i<num_vals;++i) {
h_data[i] = float(i);
}
float *d_data = NULL;
float malloc_timer;
cudaEventCreate(&start);
cudaEventCreate(&stop); cudaEventRecord( start, 0 );
cudaMemcpy(d_data, h_data, sizeof(float)*num_vals,cudaMemcpyHostToDevice);
cudaMalloc((void**)&d_data, sizeof(float)*num_vals);
cudaEventRecord( stop, 0 ); cudaEventSynchronize( stop ); cudaEventElapsedTime( &malloc_timer, start, stop );
cudaEventDestroy( start );
cudaEventDestroy( stop );
float mem_timer;
cudaEventCreate(&start);
cudaEventCreate(&stop); cudaEventRecord( start, 0 );
cudaMemcpy(d_data, h_data, sizeof(float)*num_vals,cudaMemcpyHostToDevice);
cudaEventRecord( stop, 0 ); cudaEventSynchronize( stop ); cudaEventElapsedTime( &mem_timer, start, stop );
cudaEventDestroy( start );
cudaEventDestroy( stop );
float kernel_timer;
cudaEventCreate(&start);
cudaEventCreate(&stop); cudaEventRecord( start, 0 );
test_kernel<<<1000,256>>>(d_data);
cudaEventRecord( stop, 0 ); cudaEventSynchronize( stop ); cudaEventElapsedTime( &kernel_timer, start, stop );
cudaEventDestroy( start );
cudaEventDestroy( stop );
printf("cudaMalloc took %f ms\n",malloc_timer);
printf("Copy to the GPU took %f ms\n",mem_timer);
printf("Test Kernel took %f ms\n",kernel_timer);
cudaMemcpy(h_data,d_data, sizeof(float)*num_vals,cudaMemcpyDeviceToHost);
delete[] h_data;
return 0;
}
結果である
GPU0 cudaMallocは0.908640ミリ秒を要しました GPUへのコピーは、296.058777ミリ秒を要しました テストカーネルがかかった326.721283 MS
GPU1 cudaMallocは0.913568ミリ秒を要しました GPUへのコピーの 663.182251 MS を取りました テストカーネルがかかった326.710785 MS
GPU2 cudaMallocは0.925600ミリ秒を要しました GPUへのコピーは、296.915039ミリ秒を要しました テストカーネルがかかった327.127930 MS
GPU3 cudaMallocは0.920416ミリ秒を要しました GPUへのコピーは、296.968384ミリ秒を要しました テストカーネルがかかった327.038696 MS
あなたが見ることができるようには、GPUへのcudaMemcpyは、GPU1のための時間の重量は十分です。これは、常に遅いGPU1で、私たちのすべてのサーバー間で一貫しています。 なぜこれが任意のアイデアであってもよいですか? すべてのサーバーは、Windows XPを実行しています。
解決
これはドライバの問題でした。最新のドライバにアップデートすると、それを修正
他のヒント
この問題を解決するかどうか確認するために、異なるスロットにカードを交換してみてください、あなたのPCIバスと問題になることがあります。これが問題である場合は、より高速なスロット経由でGTX295上にすべてのデータをコピーして、SLIトップを使用し、他の(遅いPCIバス)GPUに渡ってそれをコピーします。
あなたは、負荷への速いビデオカードのGDDRを利用することができます場合は、あなたがかもしれないのヘルプにも問題を解消することを、はるかに高い帯域幅のデバイスのデバイスtansferを行うことができます。また、いくつかの物理的な結果とテストを取得するには、NVIDIAの帯域幅のテストであなたの帯域幅を確認します。
グッドラック!
あなたは、デュアルプロセッサの設定で実行していますか?現在Tylersburgは、GPU(1)へのパスのx86(0)の帯域幅は、GPU(0)へのx86(0)から直接経路よりも遅くなるようにチップセットにバグがあります。 Intelはこのバグを修正するための新しいバージョンをリリースする必要があります。タスクセットを使用して、特定のCPUにテストプロセスをロックしてみて、あなたが得る結果か見ます。
よろしく マーク