首页 > 其他分享 >Pyopencl用法

Pyopencl用法

时间:2023-01-30 13:46:01浏览次数:45  
标签:mf cl Pyopencl res ctx 用法 queue np

基本上没有资料,实践了很长时间才掌握基本用法。

官网示例

#! /usr/bin/env python3

import pyopencl as cl
import numpy as np

a_np = np.random.rand(10**7).astype(np.float32)
b_np = np.random.rand(10**7).astype(np.float32)


ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)

mf = cl.mem_flags
a_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=a_np)
b_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=b_np)

prg = cl.Program(ctx, r"""
__kernel void sum(
    __global const float *a_g, __global const float *b_g, __global float *res_g)
{
  int gid = get_global_id(0);
  res_g[gid] = a_g[gid] + b_g[gid];
}
""").build()

res_g = cl.Buffer(ctx, mf.WRITE_ONLY, a_np.nbytes)
knl = prg.sum  # Use this Kernel object for repeated calls
knl(queue, a_np.shape, None, a_g, b_g, res_g)


res_np = np.empty_like(a_np)
cl.enqueue_copy(queue, res_np, res_g)

# Check on CPU with Numpy:
# print(res_np - (a_np + b_np))
# print(np.linalg.norm(res_np - (a_np + b_np)))
assert np.allclose(res_np, a_np + b_np)

解析

Pyopencl程序的大概流程为:

1.通过pyopencl.create_some_context构建一个类似会话的对象ctx

2.基于ctx构建queue对象

3.以ctx为参数,用pyopencl.Buffer拷贝Python数据到显卡缓存中

4.以ctx为参数,通过pyopencl.Program(script).build()编译c语言,通过编译对象的属性获取c函数(如示例的prg.sum)

5.以queue为参数,运行c函数

6.以queue为参数,将结果从显存拷贝到Python数据结构中

 

参数含义

运行c函数时,需要在前面额外传入三个参数,如示例中的knl(prg.sum)函数,它们分别为:

  1. queue对象
  2. 需要启动的线程大小(一个元组,代表各维度的大小,最小为一维,如(100,))
  3. 未知

其中第二个参数如果大于实际使用的数量,会报错,因为后面的线程根据gid取的数据地址不存在,然而这不影响最终结果。

报错:找不到平台

在Windows下没安装任何平台,没有遇见过报错,然而在没有显卡的linux平台上,遇见了下面的报错:

pyopencl._cl.LogicError: clGetPlatformIDs failed: PLATFORM_NOT_FOUND_KHR

意思是找不到OpenCL能运行的环境。

有的机器能用python的oclgrind包作为虚拟环境,有的却不能,可能要安装英特尔的官方opencl驱动才能用。

 

标签:mf,cl,Pyopencl,res,ctx,用法,queue,np
From: https://www.cnblogs.com/roundfish/p/17075631.html

相关文章

  • 第五节:Less、Scss简介以及核心用法总结
    一.Less简介       二.Less核心用法       三. Scss简介      四. Scss核心用法        !作 ......
  • DataSet用法详细
    DataSet用法详细一、特点介绍1、处理脱机数据,在多层应用程序中很有用。2、可以在任何时候查看DataSet中任意行的内容,允许修改查询结果的方法。3、处理分级数据4、缓存......
  • C#中new的三种用法
    1.运算符:创建对象实例 ClassC1=newClass();2.修饰符:在派⽣类定义⼀个重名的成员,隐藏掉基类中的成员publicclassProgram:BaseClass{newpublicclassTe......
  • Java反射之Field用法
    参考:https://www.cnblogs.com/ldq2016/p/6834643.htmlhttps://www.cnblogs.com/cuglkb/p/8463039.html工具类:publicclassObjectUtils{staticpublicfinalBo......
  • @ContextConfiguration的用法
    @ContextConfiguration的用法在SpringBoot测试@ContextConfiguration这个注解通常与@RunWith(SpringJUnit4ClassRunner.class)联合使用用来测试当一个类添加了注解@Com......
  • 解释函数 foo() {} 和 var foo = function() {} 之间 foo 用法的差异
    在JavaScript中,我们有不同的方法来定义函数。函数foo(){}和varfoo=function(){}是定义函数的两种不同方法。这两种方式都有其优点和不同的用例;但是,两者在执行函数......
  • Python定义全局变量的用法
    全局变量是编程语言中常见的一种变量,通过全局定义,可以是某对象函数创建,也可以是本程序任何位置创建,能够被本程序中的所有对象或函数进行引用,全局变量的定义有利于程序的变......
  • 【高并发】AQS中的CountDownLatch、Semaphore与CyclicBarrier用法总结
    CountDownLatch概述同步辅助类,通过它可以阻塞当前线程。也就是说,能够实现一个线程或者多个线程一直等待,直到其他线程执行的操作完成。使用一个给定的计数器进行初始化,该......
  • 【基础】时间Date常用用法
    Date.now()和new.Date().getTime()都是获取1970年1月1日截止到现在时刻的时间戳。但是从性能上来讲Date.now()要快于new.Date().getTime()。Date.now()和Date.parse(date......
  • Field Symbol和Type Ref To的用法和比较
    FieldSymbol和TypeRefTo在ABAP中都有着类似指针的作用,下面结合对比和实例来介绍两者的用法和区别。先预定义类型ty_ym,内表it_ym,工作区wa_ym,变量v_ym(char20)以供后面使用......