CUDA:マルチGPUではGPU 1へのメモリコピーが遅い

cuda memory multi-gpu performance
CUDA:マルチGPUではGPU 1へのメモリコピーが遅い

私の会社では、2つのGTX 295のセットアップがあるため、サーバーには合計4つのGPUがあり、複数のサーバーがあります。 GPU 0、2、3と比較して、GPU 1は特に低速だったため、問題の原因を見つけるのに役立つ速度テストを少し書きました。

//#include
//#include
//#include
#include
#include
#include
#include
#include

__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>>(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ミリ秒かかりました

GPU1 cudaMallocには0.913568ミリ秒かかりましたGPUへのコピーには* 663.182251ミリ秒*テストカーネルには326.710785ミリ秒かかりました

GPU2 cudaMallocは0.925600ミリ秒かかりましたGPUへのコピーは296.915039ミリ秒かかりましたテストカーネルは327.127930ミリ秒かかりました

GPU3 cudaMallocには0.920416ミリ秒かかりましたGPUへのコピーには296.968384ミリ秒かかりましたテストカーネルには327.038696ミリ秒かかりました

ご覧のとおり、GPUへのcudaMemcpyはGPU1の時間の2倍です。 これはすべてのサーバーで一貫しており、常にGPU1が低速です。 なぜこれがあるかもしれないのアイデアは? すべてのサーバーがWindows XPを実行しています。

  0  2


ベストアンサー

これはドライバーの問題でした。 最新のドライバーに更新すると修正されました

1


これはPCIバスの問題である可能性があります。カードを別のスロットに交換して、問題が解決するかどうかを確認してください。 これが問題になる場合は、高速スロットを介してすべてのデータをgtx295にコピーし、sli topを使用して他の(低速pciバス)gpuにコピーします。

0


高速なビデオカードのgddrを使用してロードできる場合は、はるかに高い帯域幅でデバイスデバイスのタンスファーを実行できます。これにより、問題を解消することもできます。 また、物理的な結果を取得してテストするには、NVidiaの帯域幅テストで帯域幅を確認します。

がんばろう!

0


デュアルプロセッサセットアップで実行していますか? 現在のTylersburgチップセットにはバグがあり、x86(0)からGPU(1)へのパスの帯域幅がx86(0)からGPU(0)への直接パスよりも遅くなっています。 Intelは、このバグを修正するために新しいバージョンをリリースする必要があります。 タスクセットを使用して特定のCPUにテストプロセスをロックして、どのような結果が得られるかを確認してください。

マークについて

0


タイトルとURLをコピーしました