《OpenCL异构并行编程实战》第十二至十四章
▶ 第十二章,在其他语言中使用 OpenCL
● JOCL(Java Building for OpenCL),PyOpenCL
● 一个 PyOpenCL 的例子代码,需要 pyopencl 包
import pyopencl as cl
import numpy as np
import numpy.linalg as la a = np.random.rand(50000).astype(np.float32)
b = np.random.rand(50000).astype(np.float32) ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx) mf = cl.mem_flags
a_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf = a)
b_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf = b)
c_buf = cl.Buffer(ctx, mf.WRITE_ONLY, b.nbytes) code = """
__kernel void vecadd(__global const float *a, __global const float *b, __global float *c)
{
int gid=get_global_id(0);
c[gid] = a[gid] + b[gid];
}
"""
prg = cl.Program(ctx, code).build() prg.vecadd(queue, a.shape, None, a_buf, b_buf, c_buf) a_plus_b = np.empty_like(a)
cl.enqueue_copy(queue, a_plus_b, c_buf) print(sum(a_plus_b - (a + b)))
● OpenCL 对象的生命周期不是由一个 C 作用域来定义,而是由引用计数操作来定义。
▶ 第十三章,OpenCL 的性能剖析和调试
● 查看事件状态
void initializeCL(void)
{
cl_int status = ;
cl_ulong time;
cl_event ev;
cl_platform_id platform;
cl_device_id device;
cl_context context;
cl_command_queue commandQueue; clGetPlatformIDs(, &platform, NULL);
clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, , &device, NULL);
context = clCreateContext(NULL, , &device, NULL, NULL, NULL);
commandQueue = clCreateCommandQueue(context, device, CL_QUEUE_PROFILING_ENABLE, &status);// 创建队列时传入事件分析属性值,之后无法变更 ...// 关于ev 的一些操作 clGetEventProfilingInfo(ev, CL_PROFILING_COMMAND_QUEUED, sizeof(cl_ulong), &time, NULL);// 获取事件进入命令队列的时刻
clGetEventProfilingInfo(ev, CL_PROFILING_COMMAND_SUBMIT, sizeof(cl_ulong), &time, NULL);// 获取事件提交到设备的时刻
clGetEventProfilingInfo(ev, CL_PROFILING_COMMAND_START, sizeof(cl_ulong), &time, NULL); // 获取事件开始执行的时刻
clGetEventProfilingInfo(ev, CL_PROFILING_COMMAND_END, sizeof(cl_ulong), &time, NULL); // 获取事件执行完成的时刻
}
● 启用 AMD printf 扩展,允许咋个核函数中使用 printf 函数
#pragma OPENCL EXTENSION cl_amd_printf: enable
▶ 第十四章,某图像分析应用的性能调优
● Kernel Occupancy,定义为 NWA(一个计算单元上能并发执行的 wavefront 数目)与 NWT(该计算单元能启动的 wavefront 数目的最大值)之比。NWA取决于三个因素:每个 work-item 需要的 GPRS 数目,每个 workgroup 需要的本地内存大小(LDS)和 workgroup 的尺寸。
● LDS 对 KO 的影响:WFLDSmax = min{WGCUmax, WGmax} * WFWG。WFWG 为每个 workgroup 的 wavefront 大小(与 LDS 大小没有必然联系);WGCUmax 为硬件规定一个计算单元中 workgroup 的数量上限,WGmax = LDSCU / LDSWG 为用本地内存计算得到的工作组数量上限,LDSCU 为本地内存大小, LDSWG 为一个 workgroup 需要的 LDS 的大小。
● GPR 对 KO 的影响:WFGPRmax = floor(WFGPR / WFWG) * WFWG。WFGPR = Nregmax / Nregused,为每个 work-item 使用的寄存器的最大数量和。这里相当于把 WFGPR 乡下四舍五入到 的整数倍 WFWG。
● 如果一个 kernel 的性能受 GPRS 的限制,而不受 LDS 的限制,则将部分数据转入 LDS 中会部分优化性能,过多的转移数据会进入全局内存中,严重影响执行速度
《OpenCL异构并行编程实战》第十二至十四章的更多相关文章
- 《OpenCL异构并行编程实战》补充笔记散点,第一至四章
▶ 总体印象:适合 OpenCL 入门的书,有丰富的代码和说明,例子较为简单.先把 OpenCL 代码的基本结构(平台 → 设备 → 上下文 → 命令队列 → 创建缓冲区 → 读写缓冲区 → 编译代码 ...
- 《OpenCL异构并行编程实战》补充笔记散点,第五至十二章
▶ 第五章,OpenCL 的并发与执行模型 ● 内存对象与上下文相关而不是与设备相关.设备在不同设备之间的移动如下,如果 kernel 在第二个设备上运行,那么在第一个设备上产生的任何数据结果在第二个 ...
- 【ARM-Linux开发】OpenACC并行编程实战笔记
今年运气比较好,学了cuda之后,了解到了gpu的另两种使用语言opencl和openacc, opencl(Open Computing Language ,开放计算语言)是面向异构系统的并行编程 ...
- #Python编程从入门到实践#第四章笔记
#Python编程从入门到实践#第四章笔记 操作列表 1.遍历列表 使用for循环,遍历values列表 for value in values: print(value) 2.数字列表 使 ...
- 【全面解禁!真正的Expression Blend实战开发技巧】第四章 从最常用ButtonStyle开始 - PathButton
原文:[全面解禁!真正的Expression Blend实战开发技巧]第四章 从最常用ButtonStyle开始 - PathButton 上一篇我们介绍了TextButton,但为了追求界面的张力, ...
- 《Visual C++并行编程实战》译者序
说来凑巧,当开始着手这本书的翻译时,我刚刚入手了自己第一台四核计算机,而翻译工作临近完成之时,我又为自己添置了一台iPad 2(这是一台双核计算机).由此可见,多核计算机已经完全进入了我的日常生活.鉴 ...
- 《JAVA并发编程实战》示例程序 第三章
3.1 可见性 程序清单3-1 在没有同步的情况下共享变量(不要这么做) /** * 主线程和读线程都将访问共享变量:ready 和 number * 结果可能 * 1. 主线程先运行完,读线程后运行 ...
- 《GPU高性能编程CUDA实战中文》中第四章的julia实验
在整个过程中出现了各种问题,我先将我调试好的真个项目打包,提供下载. /* * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. ...
- 《Java并发编程实战》读书笔记-第5章 基础构建模块
同步容器类 同步容器类实现线程安全的方式:将所有状态封装起来,对每个公有方法使用同步,使得每一次只有一个线程可以访问.同步容器类包含:Vector.Hashtable.Collections.sync ...
随机推荐
- ibatis.net 实现多数据库配置
1.1 功能介绍 使用ibatis.net ORM框架时,有时候需要操作多个数据库,同时有时候也需要对连接数据库信息进行加密,本文通过将配置连接写到Web.config中, 这样就可以在Web.co ...
- (GoRails)ActiveRecord --explain方法:(优化你的查询)
https://gorails.com/episodes/activerecord-explain?autoplay=1 比如没有加index的查询和加了index的查询,调用数据库的速度就差5倍. ...
- UVA-11183 Teen Girl Squad (最小树形图、朱刘算法模板)
题目大意:给一张无向图,求出最小树形图. 题目分析:套朱-刘算法模板就行了... 代码如下: # include<iostream> # include<cstdio> # i ...
- HTML <select> 标签
定义和用法 select 元素可创建单选或多选菜单. <select&> 元素中的 <option> 标签用于定义列表中的可用选项. HTML 4.01 与 HTML ...
- iOS面试准备之思维导图(转)
以思维导图的方式对iOS常见的面试题知识点进行梳理复习. 目录 1.UI视图相关面试问题 2.Runtime相关面试问题 3.内存管理相关面试问题 4.Block相关面试问题 5.多线程相关面试问题 ...
- iOS开发Objective-C基础之──多态
Objective-C语言是面向对象的高级编程语言,因此,它具有面向对象编程所具有的一些特性,即:封装性.继承性和多态性. 今天介绍一下Objective-C中的多态性. 一.什么是多态 多态:不同对 ...
- L3-013 非常弹的球 (30 分)
刚上高一的森森为了学好物理,买了一个“非常弹”的球.虽然说是非常弹的球,其实也就是一般的弹力球而已.森森玩了一会儿弹力球后突然想到,假如他在地上用力弹球,球最远能弹到多远去呢?他不太会,你能帮他解决吗 ...
- DesignPattern(二) 创建型模式
创建型模式 创建型模式就是用来创建对象的模式,抽象了实例化的过程.所有的创建型模式都有两个共同点.第一,它们都将系统使用哪些具体类的信息封装起来:第二,它们隐藏了这些类的实例是如何被创建和组织的.创建 ...
- ballerina 学习十七 多线程编程
并发&&多线程开发对于日常的处理是比较重要的,ballerina 支持的模式有work fork/join async lock 基本workers 参考代码 import balle ...
- Android自动化测试-UiAutomator2环境搭建
Android自动化测试-UiAutomator环境搭建(QQ交流群:490451176) 一.环境准备 1. 安装android sdk,并配置环境变量 2. 安装android studio,国内 ...