CUDA-PCIe速率

检测PCIe的数据传输速度

当从Host 拷贝数据到Device的过程中,数据需要通过PCIe实现拷贝。所以你的主板的PCIe的版本和传输速度就会影响CUDA 代码的效率。

首先你需要知道你的GPU的显存大小。比如我的P106 有6GB 的VRAM。然后分别传输1GB,2GB,… 的数据。

假如传输int型数据,根据:

1
printf("this TYPE size: %lu Bytes\n", sizeof(TYPE));

来得到所使用的机器存储一个int型所需多少空间。我的机器存储int型需要4Bytes。

如果要传输3GB的数据,那么所需int型数据的数量为:

1
2
1GB = 1024*1024*1024*1 Bytes
1GB / 4Byte = 268435456

将这个数赋值给N。

之后,分别在Host和Device上开辟空间,最后计时从Host拷贝到Device所需时间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define N 268435456  // 1GB int

int* h_a;
h_a = (int*)malloc(N*sizeof(int));

int* dev_a;
cudaMalloc((int**)&dev_a, N*sizeof(int));

for (int i = 0; i < N; i++){
h_a[i] = 0;
}

clock_t start = clock();
cudaMemcpy(dev_a, h_a, N*sizeof(TYPE), cudaMemcpyHostToDevice);
clock_t end = clock();
printf("time: %.10f s \n", (double)(end - start) / CLOCKS_PER_SEC);


free(h_a);
cudaFree(dev_a);

之后可以逐步增加数据量,知道VRAM极限。如下是实验结果,传输数据量及所需时间:

1
2
3
4
5
6
7
8
9
1GB: 268435456    //  1.349s
2GB: 268435456*2 // 2.700s
3GB: 268435456*3 // 4.050s
4GB: 268435456*4 // 5.400s
5GB: 268435456*5 // 6.750s
5.5GB: // 7.430s
5.75GB: // 7.760s

6GB: 268435456*6 // 0.000s

6GB 的数据错误是因为VRAM不可能全部给用户使用。
所传输数据量越大,经过PCIe传输时间也就越长。这样可以感受PCIe的速度。