▶ 第五章,OpenCL 的并发与执行模型

● 内存对象与上下文相关而不是与设备相关。设备在不同设备之间的移动如下,如果 kernel 在第二个设备上运行,那么在第一个设备上产生的任何数据结果在第二个设备上都是随需可用的。

● OpenCL 中任务图通过事件对象来构建,事件对象不仅注册任务的完成,而且保证被此任务访问的所有内存数据的一致性。

● 一个设备可以有多个命令队列,每个设备都必须有自己的命令队列。

● OpenCL 事件可以实现同一个上下文中的同步,而不能保证同一设备上的同步。

● sub-buffer 对象,允许将单独的一个 bufer 对象拆分为多个可以重叠的较小的 buffer,并使用与原 buffer 相同的方式进行读写。

● image 对象与 buffer 对象主要有几方面不同:image 对象对设备代码来说是不可见的,不能通过直镇进行访问,需要使用特定的函数进行访问;可以使多维结构;仅限于图像相关数据类型,而不能实现任意的数据结构;image 对象始终位于全局内存中。

● image 对象只能制度或只写,不能同时可读可写。

● Z 序(或称 Morton 序)内存布局使用的映射方式保留着数据访问的空间局部性,如下图所示

  

● 同一个 work-item 内,对同一个地址的两个读写操作不会被硬件或编译器重新排序

● OpenCL 之定义了整数类型的原子操作,每个有返回值的原子操作将返回操作位置的初始值,若返回值被忽略,编译器见自动改用没有返回值的原子操作

● 本地内存 __local 的申请方法

 cl_uint status = clSetKernelArg(kernel, , sizeof(float), );// 缓冲区地址(最后一个参数)设为 0

▶ 第六章,OpenCL 在 CPU/GPU 上的实现

● OpenCL CPU 运行时将创建一个运行在 CPU 每一个核上的线程,将他作为一个工作池来处理生成的 OpenCL kernel,任务队列的任务分配由核心管理者线程负责,在一个操作系统线程上运行 workgroup,一个 workgroup 内的线程是没有并行性,一次只能处理一个 work-item,在 barrier 或 kernel 的结束处工作线程才对转而处理下一个 work-item

● AMD 的OpenCL CPU 运行时是通过函数 setjmp 和函数 longjmp 来实现每个 barrier 前的任务轮转的

● OpenCL 允许的扩展数据类型和运算举例

 float inputData[] = { .f,.f,.f,.f };
float4 a = inputData[];
float4 b = + (float4)(.f, .f, .f, .f);
float outputData[] = b;

▶ 第七章,数据管理

● 共享内存易购系统芯片(System-on-a-Chip,SoC)

● 讲了缓冲区的几种标识符,不知道是不是翻译的问题,讲的非常烂

 /* cl_mem_flags - bitfield */
#define CL_MEM_READ_WRITE (1 << 0)
#define CL_MEM_WRITE_ONLY (1 << 1)
#define CL_MEM_READ_ONLY (1 << 2)
#define CL_MEM_USE_HOST_PTR (1 << 3)
#define CL_MEM_ALLOC_HOST_PTR (1 << 4)
#define CL_MEM_COPY_HOST_PTR (1 << 5)
/* reserved (1 << 6) */
#define CL_MEM_HOST_WRITE_ONLY (1 << 7)
#define CL_MEM_HOST_READ_ONLY (1 << 8)
#define CL_MEM_HOST_NO_ACCESS (1 << 9)

▶ 第八章,OpenCL 案例学习:卷积

● 容易理解的插图

  

● clEnqueueWriteBufferRect 函数,向设备 buffer 中写入较大的二维缓冲区

 extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueWriteBufferRect(
cl_command_queue, // 命令队列
cl_mem, // 目标缓冲区
cl_bool, // 是否阻塞传输
const size_t *, // size_t[3],缓冲区偏移
const size_t *, // size_t[3],主机偏移
const size_t *, // size_t[3],包含数据列宽(Byte),行数,片数
size_t, // 缓冲区数据列宽(Byte)
size_t, // 缓冲区数据片数
size_t, // 主机数据列宽(Byte)
size_t, // 主机数据片数
const void *, // 主机指针
cl_uint, // 事件列表三连
const cl_event *,
cl_event *
) CL_API_SUFFIX__VERSION_1_1;

▶ 第九章,OpenCL 案例学习:直方图

● 为了最有效的利用本地内存,减少到全局内存的数据传输开销,workGroup 的数量应该尽可能接近设备上计算单元或 SIMD 单元的数量

▶ 第十章,OpenCL 案例学习:混合粒子模拟

● 略过代码

▶ 第十一章,OpenCL 扩展

● KHR 扩展,EXT 扩展,厂商扩展

● 某些特性需要有一些编译指导指令来控制.extension_name 是特性名,behavior 为 enable 或 disable

 #pragma OPENCL EXTENSION extension_name : behavior

●  起用双精度浮点数

 #pragma cl_khr_fp64: enable

● 设备拆分(我的电脑不支持)

 #include <iostream>
#include <cl.hpp> #define USE_CL_DEVICE_FISSION 1 using namespace std; int main()
{
vector<cl::Platform>listPlatform;
cl::Platform::get(&listPlatform);
cl_context_properties properties[] = { CL_CONTEXT_PLATFORM, (cl_context_properties)(listPlatform[])(), };// 没有设备的情况下创建上下文
cl::Context context = cl::Context(CL_DEVICE_TYPE_GPU, properties);
vector<cl::Device>listDevice = context.getInfo<CL_CONTEXT_DEVICES>(); if (listDevice[].getInfo<CL_DEVICE_EXTENSIONS>().find("cl_ext_device_fission") == string::npos)
{
cout << "\n\tNot support Device Fission.\n" << endl;
getchar();
exit(-);
} const cl_device_partition_property_ext subDevicePropertities[] = { CL_DEVICE_PARTITION_EQUALLY_EXT, , CL_PROPERTIES_LIST_END_EXT , };
vector<cl::Device>subDevice;
listDevice[].createSubDevices((const cl_device_partition_property *)subDevicePropertities, &subDevice); getchar();
return ;
}

● 略过设备拆封和浮点型矩阵乘法的代码

▶ 第十二章,在其他语言中使用 OpenCL

● JOCL(Java bindings for OpenCL)

● 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)))

● Haskell 语言特点:用表达式描述函数,根据传入的参数进行求值;不定义语句顺序,不允许函数副作用;除了声明以外没有赋值;线程安全的。

《OpenCL异构并行编程实战》补充笔记散点,第五至十二章的更多相关文章

  1. 《OpenCL异构并行编程实战》第十二至十四章

    ▶ 第十二章,在其他语言中使用 OpenCL ● JOCL(Java Building for OpenCL),PyOpenCL ● 一个 PyOpenCL 的例子代码,需要 pyopencl 包 i ...

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

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

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

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

  4. [CSAPP笔记][第十二章并发编程]

    第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟 ...

  5. 《Linux命令行与shell脚本编程大全》 第二十二章 学习笔记

    第二十二章:使用其他shell 什么是dash shell Debian的dash shell是ash shell的直系后代,ash shell是Unix系统上原来地Bourne shell的简化版本 ...

  6. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十二章:几何着色器(The Geometry Shader)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十二章:几何着色器(The Geometry Shader) 代码工 ...

  7. sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)

    第六章: 管理数据库事务 事务 是 由第五章 数据操作语言完成的  DML ,是对数据库锁做的一个操作或者修改. 所有事务都有开始和结束 事务可以被保存和撤销 如果事务在中途失败,事务中的任何部分都不 ...

  8. 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条

    http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...

  9. Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

    Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...

随机推荐

  1. PHP如何生成文章预览图

    PHP如何生成文章预览图 一.总结 一句话总结:php的wkhtmltox扩展,php官方文档有怎么使用,或者github,或者百度,等等等等 wkhtmltox 1.PHP如何自动生成文章预览图? ...

  2. docker容器互联 (.net core容器,mysql容器)

    背景 有两个容器一个运行的.net core的项目 另一个运行的mysql的数据 并且这两个容器在同一个机子上(或者局域网),那么理论上.net core的项目去访问mysql是可以走内网的 但是容器 ...

  3. Leetcode 63

    //一维dp还是比较难写的class Solution { public: int uniquePathsWithObstacles(vector<vector<int>>&a ...

  4. 使用扩展方法(Chapter3 P39-41)

    namespace LanguageFeatures { public class ShoppingCart { public List<Product> Products { get; ...

  5. snmpwalk-MIB of S5700-idc-stack

    IF-MIB:.iso.org.dod.internet.mgmt.mib-2.interfaces.ifTable.ifEntry.ifDescrOID:.1.3.6.1.2.1.2.2.1.2 针 ...

  6. 【Matplotlib】概要总览第一讲

    之前一直使用 matplotlib, 但都是随用随查,现在特开此系列帖子已记录其学习过程. Matplotlib可能是Python 扩展包中仅有的最流行的 2D 绘图库.她不仅提供了快速的方式可视化P ...

  7. jQuery插件开发——全屏切换插件

    这个插件包含三个部分:HTML结构.CSS代码和JS代码. HTML结构是固定的,结构如下: <!--全屏滚动--> <div class="fullpage-contai ...

  8. Mysql5.7的gtid主从半同步复制和组复制

    (一)gtid主从半同步复制 一.半同步复制原理 mysql默认的复制是异步的,主库在执行完客户端提交的事务后会立即将结果返回给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主库如果cr ...

  9. PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/phalcon.so' - /usr/lib64/php/mod

    这个警告可能是,扩展在php.d里面加载了一遍,然后又在php.ini里写了一遍导致的

  10. CUDA Samples: matrix multiplication(C = A * B)

    以下CUDA sample是分别用C++和CUDA实现的两矩阵相乘运算code即C= A*B,CUDA中包含了两种核函数的实现方法,第一种方法来自于CUDA Samples\v8.0\0_Simple ...