如何通过clGetDeviceInfo()估算GPU性能以分配CPU/GPU工作负载
我希望自动决策CPU与GPU之间的工作负载分配,计划遍历所有设备,通过公式 GFLOPS = clock_speed * number_of_cores 粗略估算理论计算能力(注:我知道这非常粗略,不同架构下每种操作的时钟周期数不同,还存在缓存未命中等低效问题,但仍可作为计算能力的大致参考)。
目前我可通过 clGetDeviceInfo() 获取 CL_DEVICE_MAX_CLOCK_FREQUENCY 和 CL_DEVICE_MAX_COMPUTE_UNITS 参数,其中时钟频率1777 MHz合理,但我的NVIDIA GeForce RTX 3060的计算单元数显示为28,与该显卡的核心配置Core Config: 3584 112:48:28:112不符。
查阅OpenCL文档得知:
CL_DEVICE_MAX_COMPUTE_UNITS
The number of parallel compute units on the OpenCL device. A work-group executes on a single compute unit. The minimum value is 1.
于是尝试调整公式为 GFLOPS = CL_DEVICE_MAX_CLOCK_FREQUENCY * CL_DEVICE_MAX_COMPUTE_UNITS * CL_DEVICE_MAX_WORK_GROUP_SIZE,但该公式应用在Intel CPU上时,因CL_DEVICE_MAX_WORK_GROUP_SIZE = 4096会得出CPU性能强于GPU的错误结论。
我已打印clGetDeviceInfo()返回的所有设备参数,但未找到所需信息:
OpenCL platform count 2 DEVICE[0,0]: NVIDIA GeForce RTX 3060 VENDOR: NVIDIA Corporation DEVICE_VERSION: OpenCL 3.0 CUDA DRIVER_VERSION: 515.86.01 C_VERSION: OpenCL C 1.2 MAX_COMPUTE_UNITS: 28 MAX_CLOCK_FREQUENCY: 1777 MHz GLOBAL_MEM_SIZE: 12019 MB LOCAL_MEM_SIZE: 48 kB CONSTANT_BUFFER_SIZE: 64 kB GLOBAL_MEM_CACHE_SIZE: 784 kB GLOBAL_MEM_CACHELINE_SIZE: 128 MAX_WORK_ITEM_DIMENSIONS: 3 MAX_WORK_GROUP_SIZE: 1024 MAX_WORK_ITEM_SIZES: [1024,1024,1024] MIN_DATA_TYPE_ALIGN_SIZE: 128 DEVICE[1,0]: pthread-Intel(R) Core(TM) i5-10400F CPU @ 2.90GHz VENDOR: GenuineIntel DEVICE_VERSION: OpenCL 1.2 pocl HSTR: pthread-x86_64-pc-linux-gnu-skylake DRIVER_VERSION: 1.8 C_VERSION: OpenCL C 1.2 pocl MAX_COMPUTE_UNITS: 12 MAX_CLOCK_FREQUENCY: 4300 MHz GLOBAL_MEM_SIZE: 13796 MB LOCAL_MEM_SIZE: 256 kB CONSTANT_BUFFER_SIZE: 256 kB GLOBAL_MEM_CACHE_SIZE: 12288 kB GLOBAL_MEM_CACHELINE_SIZE: 64 MAX_WORK_ITEM_DIMENSIONS: 3 MAX_WORK_GROUP_SIZE: 4096 MAX_WORK_ITEM_SIZES: [4096,4096,4096] MIN_DATA_TYPE_ALIGN_SIZE: 128
编辑补充:
通过查阅维基、NVIDIA文档得知,每个计算单元包含128个着色核心(或CUDA核心),但这是需从外部获取的厂商特定信息,我希望仅通过clGetDeviceInfo()返回的信息自动估算计算能力。
内容的提问来源于stack exchange,提问作者Prokop Hapala

