950M比970M快?

Posted

技术标签:

【中文标题】950M比970M快?【英文标题】:950M faster than a 970M? 【发布时间】:2016-09-08 19:54:06 【问题描述】:

我目前正在为我的一个朋友测试一些代码,因为我可以访问一堆不同的 MXM 模块,并且在对 950M 和 970M 之间的一些代码进行基准测试时,我得到了一些奇怪的结果。

int main(void)

    static const int WORK_SIZE = 65530;
    float *data = new float[WORK_SIZE];

    float time;
    cudaEvent_t start, stop;
    cudaEventCreate(&start);
    cudaEventCreate(&stop);

    for (int i = 0; i < 1000; i++)
    
        cudaEventRecord(start, 0);

        initialize (data, WORK_SIZE);

        float *recCpu = cpuReciprocal(data, WORK_SIZE);
        float *recGpu = gpuReciprocal(data, WORK_SIZE);
        float cpuSum = std::accumulate (recCpu, recCpu+WORK_SIZE, 0.0);
        float gpuSum = std::accumulate (recGpu, recGpu+WORK_SIZE, 0.0);

        cudaEventRecord(stop, 0);
        cudaEventSynchronize(stop);
        cudaEventElapsedTime(&time, start, stop);

        /* Verify the results */
        std::cout << i << ") gpuSum = "<<gpuSum<< " cpuSum = " <<cpuSum<< " time = " <<time<< std::endl;

        delete[] recCpu;
        delete[] recGpu;
    

    /* Free memory */
    delete[] data;

    return 0;

我在两张卡上运行了 3 次测试,950M 的平均时间约为 7 秒,而 970M 的平均时间约为 9 秒。此外,我运行了 CUDA 工具包中包含的基准程序,在 970 上仅获得 3GB/s HD 速度,而在 950 上仅获得 10GB/s。这是在运行 Ubuntu 14.04 和 CUDA 7.5 的 Skylake Xeon 上完成的。任何人都可以阐明这种差异吗? cpuReciprocal 和 gpuReciprocal 的代码如下。

/**
 * CUDA kernel that computes reciprocal values for a given vector
 */
__global__ void reciprocalKernel(float *data, unsigned vectorSize) 
    unsigned idx = blockIdx.x*blockDim.x+threadIdx.x;
    if (idx < vectorSize)
        data[idx] = 1.0/data[idx];


/**
 * Host function that copies the data and launches the work on GPU
 */
float *gpuReciprocal(float *data, unsigned size)

    float *rc = new float[size];
    float *gpuData;

    CUDA_CHECK_RETURN(cudaMalloc((void **)&gpuData, sizeof(float)*size));
    CUDA_CHECK_RETURN(cudaMemcpy(gpuData, data, sizeof(float)*size, cudaMemcpyHostToDevice));

    static const int BLOCK_SIZE = 256;
    const int blockCount = (size+BLOCK_SIZE-1)/BLOCK_SIZE;
    reciprocalKernel<<<blockCount, BLOCK_SIZE>>> (gpuData, size);

    CUDA_CHECK_RETURN(cudaMemcpy(rc, gpuData, sizeof(float)*size, cudaMemcpyDeviceToHost));
    CUDA_CHECK_RETURN(cudaFree(gpuData));
    return rc;


float *cpuReciprocal(float *data, unsigned size)

    float *rc = new float[size];
    for (unsigned cnt = 0; cnt < size; ++cnt) rc[cnt] = 1.0/data[cnt];
    return rc;

【问题讨论】:

970 的 Bios 错误。 【参考方案1】:

主机到设备的带宽由 PCI Express 性能给出。似乎 950 与 PCI Express Gen 3 16x 连接,而 970 似乎是 4x。硬件设置不详细 这是最可能的解释。 NVIDIA 工具(例如 nvidia-smi)将为您提供这些信息。 至于你的算法,最慢的部分是与主机的通信,接下来是设备内存带宽快 10 倍左右,最后是除法。

【讨论】:

谢谢!根据 SMI 的说法,我的 970 在 gen 1 中运行。但是,我知道我的主板支持 gen 3,并且我知道我的 950 在 gen 3 中。这是 970 的已知问题吗? @apizzi,这是 BIOS 配置、主板和 CPU 能力的问题。您想检查所有这些以确保链接是第 3 代。这些 MXM 模块是台式机上的完整 PCIe 卡吗?

以上是关于950M比970M快?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 removeChild 比 innerHTML = ' ' 快?

为啥 mmap()(内存映射文件)比 read() 快

递归比循环快吗?

MySQL中MyISAM为什么比InnoDB查询快

比 MySQL 快 801 倍,比 Hive 快 279 倍,ClickHouse 真的太强了!

为啥字典比列表快得多?