CUDA技巧:快速查询设备属性

CUDA程序需要知道每个块的最大共享内存或GPU中处理器数量。一种方法是调用cudaGetDeviceProperties()。但是调用这个函数会导致速度大幅下降。当在cuML中,使用随机森林算法速度慢20倍。

这有一个非常简单的CUDA Tips:cudaDeviceGetAttribute()是一种更快速查询设备属性的方法。

通常而言,使用GPU运行是不需要知道所有属性,只用知道比如maximum block size, the number of multiprocessors, or the maximum shared memory per block。但是cudaGetDeviceProperties()会提供所有信息。

相比之下,cudaDeviceGetAttribute()为每个调用提供一个属性 - 就是您要求的属性。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
int smemSize, numProcs;
auto start = chrono::high_resolution_clock::now();
for (int i = 0; i < 25; ++i) {
cudaDeviceGetAttribute(&smemSize,
cudaDevAttrMaxSharedMemoryPerBlock, devId);
cudaDeviceGetAttribute(&numProcs,
cudaDevAttrMultiProcessorCount, devId);
}

auto end = chrono::high_resolution_clock::now();
cout << "cudaDeviceGetAttribute -> "
<< chrono::duration_cast<chrono::microseconds>(end - start).count() / 25.0
<< "us" << endl;

输出:

1
cudaDeviceGetAttribute -> 0.08us

ref:

https://devblogs.nvidia.com/cuda-pro-tip-the-fast-way-to-query-device-properties/