如何查询SYCL使用cpu_selector时的CPU线程数及核心运行状态
SYCL cpu_selector 模式下CPU线程占用查询方法
你可以通过SYCL内置接口+系统观测工具组合的方式,拿到实际线程占用情况、判断单核/多核运行状态,具体方案如下:
- 用SYCL原生接口查运行时识别的并行能力
程序内直接调用设备信息查询接口,就能拿到SYCL运行时可调度的最大CPU计算单元(逻辑线程)数,这个值可以直接用来判断运行时的调度模式是单核还是多核:
注意:这个接口返回的是运行时支持的最大并行规模,不是某一时刻程序实际占用的线程数,实时占用值需要靠系统工具统计。#include <sycl/sycl.hpp> #include <iostream> int main() { // 用cpu_selector构造队列 sycl::queue q(sycl::cpu_selector_v); sycl::device cpu_dev = q.get_device(); // 查询运行时识别到的最大计算单元数,对应CPU逻辑核心数 uint32_t max_cu = cpu_dev.get_info<sycl::info::device::max_compute_units>(); std::cout << "SYCL运行时可调度的最大CPU逻辑核心数:" << max_cu << std::endl; if (max_cu == 1) { std::cout << "当前为单核调度模式" << std::endl; } else { std::cout << "当前为多核调度模式" << std::endl; } // 业务SYCL kernel代码 // ... return 0; } - 用系统工具查程序运行时实际占用的线程数
程序启动后,通过操作系统自带的进程观测工具,直接统计进程下处于CPU运行态的线程数量,就是当前实际占用的CPU线程数:- Linux环境:先通过
ps aux | grep 你的程序名拿到进程PID,再执行top -H -p <PID>,列表里状态标记为R的就是正在占用CPU运行的线程,统计数量即可;如果想更精准统计,可以用pidstat -t -p <PID> 1每秒采样一次线程CPU占用,连续采样几秒看非零占用的线程数,结果更准。如果运行态线程长期稳定为1就是单核运行,大于1就是多核运行。 - Windows环境:打开任务管理器,切到「详细信息」栏找到对应程序进程,右键选择「转到线程」,就能看到进程下所有线程的CPU占用情况,统计正在占用CPU的线程数量即可判断运行模式。
- Linux环境:先通过
补充说明:不同SYCL实现的CPU后端大多基于OpenMP做并行调度,如果你之前通过环境变量限制了并行线程数(比如DPC++设SYCL_CPU_MAX_WORKERS=1、基于OpenMP的后端设OMP_NUM_THREADS=1强制单核运行),前面的SYCL原生接口查询到的max_compute_units值也会同步匹配你设置的线程上限。
内容的提问来源于stack exchange,提问作者Elle
相关产品推荐
相关产品推荐

