我公司拥有的两块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毫秒

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毫秒

可以看到,cudaMemcpy到GPU是很好的时间GPU1两倍。这是我们所有的服务器之间是一致的,它始终是GPU1是缓慢的。 任何想法,为什么这可能是? 所有的服务器运行Windows XP。

有帮助吗?

解决方案

这是一个驱动程序问题。更新到最新的驱动程序固定它

其他提示

这可能是您的PCI总线的问题,尝试更换卡插入插槽不同,看问题是否仍然存在。如果这是一个问题,你的所有数据复制到了GTX295通过更快的插槽,并使用SLI顶级整个复制到其他(慢PCI总线)GPU。

如果你可以利用更快的视频卡的GDDR负载,那么你可以在很多更高的带宽做设备的设备tansfer,这可能有助于消除这个问题也。另外,检查你的带宽与NVidia的带宽测试,以获得一些物理结果和测试。

祝你好运!

您在双处理器设定运行?有在当前的Tylersburg一个错误的芯片组,使得路径86(0)到GPU(1)的带宽是慢于直接从86(0)到GPU(0)路径。英特尔要发布一个新版本以修复这个bug。尝试使用taskset的锁定您的测试过程中,以特定的CPU,看看会发生什么样的结果。

问候 标记

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top