我目前正在使用具有2个cuda GPU的服务器:Quadro 400和Tesla C2075。我做了一个简单的矢量加法测试程序。我的问题是,虽然特斯拉C2075 GPU应该比Quadro 400更强大,但它需要更多时间来完成这项工作。我发现cudaMemcpy占用了大部分执行时间,并且在更强大的gpu上工作得更慢。 这是来源:
void get_matrix(float* arr1,float* arr2,int N1,int N2)
{
int Nx,Ny;
int n_blocks,n_threads;
int dev=0; // 1
float time;
size_t size;
clock_t start,end;
cudaSetDevice(dev);
cudaDeviceProp deviceProp;
start = clock();
cudaGetDeviceProperties(&deviceProp, dev);
Nx=N1;
Ny=N2;
n_threads=256;
n_blocks=(Nx*Ny+n_threads-1)/n_threads;
size=Nx*Ny*sizeof(float);
cudaMalloc((void**)&d_A,size);
cudaMalloc((void**)&d_B,size);
cudaMemcpy(d_A, arr1, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_B, arr2, size, cudaMemcpyHostToDevice);
vector_add<<<n_blocks,n_threads>>>(d_A,d_B,size);
cudaMemcpy(arr1, d_A, size, cudaMemcpyDeviceToHost);
printf("Running device %s \n",deviceProp.name);
end = clock();
time=float(end-start)/float(CLOCKS_PER_SEC);
printf("time = %e\n",time);
}
int main()
{
int const nx = 20000,ny = nx;
static float a[nx*ny],b[nx*ny];
for(int i=0;i<nx;i++)
{
for(int j=0;j<ny;j++)
{
a[j+ny*i]=j+10*i;
b[j+ny*i]=-(j+10*i);
}
}
get_matrix(a,b,nx,ny);
return 0;
}
输出结果为:
Running device Quadro 400
time = 1.100000e-01
Running device Tesla C2075
time = 1.050000e+00
我的问题是:
我正在运行Linux Open Suse 11.2。源代码使用nvcc编译器(版本4.2)编译。
感谢您的帮助!
答案 0 :(得分:1)
尝试两次调用get_matrix(a,b,nx,ny)
并获取第二个计时结果。第一次调用CUDA API将创建cuda上下文。这通常需要很长时间。
有关如何确定块大小和网格大小,请参阅“CUDA C最佳实践指南”中的this section。