0

私の会社には2つのGTX295がセットアップされているため、サーバーには合計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;
}

結果は

GPU0cudaMallocは0.908640ミリ秒かかりましたGPUへのコピーは296.058777ミリ秒かかりましたテストカーネルは326.721283ミリ秒かかりました

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

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

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

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

4

4 に答える 4

1

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

于 2010-05-29T13:08:20.160 に答える
0

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

于 2010-04-16T09:00:15.777 に答える
0

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

幸運を!

于 2010-04-19T17:43:32.073 に答える
0

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

マークに関して

于 2010-04-22T15:48:47.830 に答える