CUDA:存储器复制到GPU 1是在多GPU慢
-
23-09-2019 - |
题
我公司拥有的两块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,看看会发生什么样的结果。
问候 标记