PyOpenCL示例-01.设备遍历

​“Python是目前较流行的一种科学计算语言。语法简洁,上手快,易于维护的优点。但其运算速度是真心的慢。那我们能否利用Python的简洁+OpenCL的运算能力呢?答案是可以的,那就是PyOpenCL。”


>>预备知识

OpenCL 是一个为异构平台编写程序的框架,此异构平台可由CPU,GPU或其他类型的处理器组成。我们先来复习下CPU和GPU的相关知识:CPU的设计让其比较擅长于处理不规则数据结构和不可预测的存取模式,以及递归算法、分支密集型代码和单线程程序。这类程序任务拥有复杂的指令调度、循环、分支、逻辑判断以及执行等步骤。而GPU擅于处理规则数据结构和可预测存取模式。

>>PyOpenCL安装

这里只介绍LINUX下的安装。

sudo apt-get install python3-pyopencl

>>基本概念

  • 计算平台指机器设备对OpenCL某个版本的具体实现。
  • 一台计算机上可以有多个计算平台,一个计算平台上可以有多个计算核心。
  • 多核CPU和多CPU是两回事,除非你的主板上插有两块CPU,这种情况也只有服务器主板上才会出现多CPU情况。
  • 一个计算平台设备里面,可以有多个计算核心,每个核心就是实质的计算部件。像4核CPU就是一个计算平台设备里面有4个计算部件。可以并行执行四个运算操作。

因此我们除了要获取系统里计算平台设备信息外,还要获取每个设备里面的计算核心信息,这样才可以对我们的程序进行最大优化。

>>设备遍历源码

​import pyopencl as cl

#显示OPENCL版本号,cl.h的版本号
print("CL_VERSION:",cl.VERSION)
print("CL_HEADER_VERSION:",cl.get_cl_header_version())
print()
​
#获取当前所有计算平台
platforms  = cl.get_platforms()
print("Platform num:",len(platforms))
​
#遍历所有平台中的所有计算设备,并显示它们的信息
for plat in platforms:
    print("--Platform Name:",plat.get_info(cl.platform_info.NAME))
  #print("--Platform Extensions:",plat.get_info(cl.platform_info.EXTENSIONS))
    print("--Platform Profile:",plat.get_info(cl.platform_info.PROFILE))
    print("--Platform Vendor:",plat.get_info(cl.platform_info.VENDOR))
    print("--Platform Version:",plat.get_info(cl.platform_info.VERSION))
​
    devices = plat.get_devices(cl.device_type.ALL)
    print("--device num:",len(devices))
​
    for device in devices:
        print("----Name:",device.get_info(cl.device_info.NAME))
        print("----OpenCL_C_Version:",device.get_info(cl.device_info.OPENCL_C_VERSION))
        print("----Vendor:",device.get_info(cl.device_info.VENDOR))
        print("----Version:",device.get_info(cl.device_info.VERSION))
        print("----Driver Version:",device.get_info(cl.device_info.DRIVER_VERSION))
​
        print("----MAX_WORK_GROUP_SIZE:",device.get_info(cl.device_info.MAX_WORK_GROUP_SIZE))
        print("----MAX_COMPUTE_UNITS:",device.get_info(cl.device_info.MAX_COMPUTE_UNITS))
        print("----MAX_WORK_ITEM_SIZES:",device.get_info(cl.device_info.MAX_WORK_ITEM_SIZES))
        print("----LOCAL_MEM_SIZE:",device.get_info(cl.device_info.LOCAL_MEM_SIZE))
 
运行结果

PyOpenCL示例-01.设备遍历
滚动到顶部