“Python是目前较流行的一种科学计算语言。语法简洁,上手快,易于维护的优点。但其运算速度是真心的慢。那我们能否利用Python的简洁+OpenCL的运算能力呢?答案是可以的,那就是PyOpenCL。”
>>预备知识
kernel:是指一个用opencl c语言编写的、代表一个单一执行实例的代码单元。opencl c语言看起来跟C语言函数非常相像,都有一个参数列表“局部”变量定义和标准控制流结构。opencl术语中把这种kernel实例称为work-item(工作项)。但opencl kernel与c语方函数的区别在于其并行语义。
work_item:是定义在一个很大的并行执行空间中的一小部分。是并行操作中每一部分的实例化。通俗来说,可以理解为kernel里定义的执行函数。当kernel启动后会创建大量work_item来同时执行,以完成并行任务。work_item根所其数据结构大小可分为一维、二维和三维数据。work_item之是的运行是相互独立的,不同步的。
work_group:opencl将全局执行空间划分为大量大小相等的,一维、二维、三维的work_item集合,这个集合就是work_group。在work_group内部,各个work_item之间允许一定程度的通信。而有work_group保证并发执行来允许其内部的work_item之间的本地同步。
barrier函数:等待工作组中所有工作项都到达barrier位置,才继续往下执行。是OpenCL一种同步管理的函数。
>>OpenCL内核函数
uint get_work_dim() : 返回线程调度的维度数。 uint get_global_size(uint dimension) : 返回在所请求维度上work_item的总数。 uint get_global_id(uint dimension) : 返回在所请求的维度上当前work_item在全局空间中的索引。 uint get_local_size(uint dimension) : 返回在所请求的维度上work-group的大小。 uint get_local_id(uint dimension) : 返回在所请求的维度上,当前work_item在work_group中的索引。 uint get_number_groups(uint dimension) : 返回在所请求维度上work-group的数目,这个值等于get_global_size 除以 get_local_size。 uint get_group_id(uint dimension) : 返回在所请求的维度上当前wrok_group在全局空间中的索引。
>>数值归并
数值归并是对数组中的每个元素进行求和的运算。比如有个一维数组,里面有8个元素,每个元素的值依次是1,2,3,4…8,求这8个元素的和是多少。一般情况我们只需写个循环,把8个元素类加即可。而我们还可以用归并的方法来解答。用归并的方法来求和有一个好处,就是可以用并行的方法来求解。看下图。
