▶ 第十二章,在其他语言中使用 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异构并行编程实战》第十二至十四章的更多相关文章

  1. 《OpenCL异构并行编程实战》补充笔记散点,第一至四章

    ▶ 总体印象:适合 OpenCL 入门的书,有丰富的代码和说明,例子较为简单.先把 OpenCL 代码的基本结构(平台 → 设备 → 上下文 → 命令队列 → 创建缓冲区 → 读写缓冲区 → 编译代码 ...

  2. 《OpenCL异构并行编程实战》补充笔记散点,第五至十二章

    ▶ 第五章,OpenCL 的并发与执行模型 ● 内存对象与上下文相关而不是与设备相关.设备在不同设备之间的移动如下,如果 kernel 在第二个设备上运行,那么在第一个设备上产生的任何数据结果在第二个 ...

  3. 【ARM-Linux开发】OpenACC并行编程实战笔记

    今年运气比较好,学了cuda之后,了解到了gpu的另两种使用语言opencl和openacc,  opencl(Open Computing Language ,开放计算语言)是面向异构系统的并行编程 ...

  4. #Python编程从入门到实践#第四章笔记

    #Python编程从入门到实践#第四章笔记   操作列表 ​​​1.遍历列表 使用for循环,遍历values列表 for value in values: print(value) 2.数字列表 使 ...

  5. 【全面解禁!真正的Expression Blend实战开发技巧】第四章 从最常用ButtonStyle开始 - PathButton

    原文:[全面解禁!真正的Expression Blend实战开发技巧]第四章 从最常用ButtonStyle开始 - PathButton 上一篇我们介绍了TextButton,但为了追求界面的张力, ...

  6. 《Visual C++并行编程实战》译者序

    说来凑巧,当开始着手这本书的翻译时,我刚刚入手了自己第一台四核计算机,而翻译工作临近完成之时,我又为自己添置了一台iPad 2(这是一台双核计算机).由此可见,多核计算机已经完全进入了我的日常生活.鉴 ...

  7. 《JAVA并发编程实战》示例程序 第三章

    3.1 可见性 程序清单3-1 在没有同步的情况下共享变量(不要这么做) /** * 主线程和读线程都将访问共享变量:ready 和 number * 结果可能 * 1. 主线程先运行完,读线程后运行 ...

  8. 《GPU高性能编程CUDA实战中文》中第四章的julia实验

    在整个过程中出现了各种问题,我先将我调试好的真个项目打包,提供下载. /* * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. ...

  9. 《Java并发编程实战》读书笔记-第5章 基础构建模块

    同步容器类 同步容器类实现线程安全的方式:将所有状态封装起来,对每个公有方法使用同步,使得每一次只有一个线程可以访问.同步容器类包含:Vector.Hashtable.Collections.sync ...

随机推荐

  1. 雷林鹏分享:Ruby 文件的输入与输出

    Ruby 文件的输入与输出 Ruby 提供了一整套 I/O 相关的方法,在内核(Kernel)模块中实现.所有的 I/O 方法派生自 IO 类. 类 IO 提供了所有基础的方法,比如 read. wr ...

  2. Oracle数据库空值操作

    空值操作: null表示空的意思. 一.情况: 1:表中的任何字段默认情况下都可以为null值. 2:not null表示非空,是一种约束 设置为非空约束的字段,必须有有效值,不能为空. 3:插入数据 ...

  3. Rails 5 Test Prescriptions 第5章 Testing Models

    Rails,model层包含业务逻辑和储存逻辑.其中储存逻辑被ActiveRecord处理. 在model中,不是每件事都必须是ActiveRecord对象.model layer可以包含各种服务,对 ...

  4. bzoj3172: [Tjoi2013]单词 ac自动机

    某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词.每个单词 ...

  5. python自动化运维之路2

    list列表 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 #!/usr/bin/env python # _*_ encoding:utf-8 _*_ # a ...

  6. vue.js 源代码学习笔记 ----- text-parse.js

    /* @flow */ import { cached } from 'shared/util' import { parseFilters } from './filter-parser' //找到 ...

  7. adb命令安装apk

    1.将需要安装的apk放在platform-tools下 2.将手机和电脑连接,在cmd中输入 adb devices查看 3.使用adb命令安装apk,在cmd中输入:adb install apk ...

  8. ubuntu16.04安装Nvidia显卡驱动、CUDA8.0和cudNN V6

    Nvidia显卡驱动安装 在ubuntu搜索框输入 软件更新,打开 "软件和更新" 对话框,在 附加驱动里选择系统检测到的Nvidia驱动,应用更改,重启系统: 安装完成之后查看G ...

  9. C语言——第四次作业(2)

    作业要求一 项目wordcount 设计思路:输入需统计的文件名,打开此文件,输入功能对应的字符,分别实现对应的功能,关闭文件. 主要代码 #include<stdio.h> #inclu ...

  10. UITableView-(单元格的自定义方法)

    //contentView //行内容 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NS ...