上周开始学习opencl实战这本书,因同时在忙本溪的一个路灯的调试项目,进展并不多。现将前两章的学习笔记整理如下:
软件安装过程:
首先下载可以编译opencl的软件开发包(software development kit ,SDK).
两种:AMDSDK和Nvidia sdk。根据你的操作系统和具体的硬件配置选择相应的。
安装sdk前要确保两点:1、硬件系统的生产厂商和具体型号以及该款硬件是否支持opencl、2、了解sdk的重要文件和基本知识。
编译任何C、C++之前都需要相应的头文件和库文件:头文件声明了常数、数据结构和函数;库文件包含了函数的可执行代码【大多数Opencl应用程序只有一个头文件:cl.h,在windows上,cl.h文件位于CL路径下】
AMD和nvidia都提供了名为OPENCL的库文件(windows 下是OpenCL.dll文件),另外还提供了了一个ICD(可安装的客户驱动)
在编译OpenCL程序时,需要告诉连接器如何访问主要的OPenCL库文件。但是并不需要指出ICD的名字和路径,这以为这你可以在不知道用户硬件类型的前提下发布你的程序。
在运行时,应用程序必须能够访问ICD文件,在windows上,和厂商相关的库文件上是设定在注册表之中的,在安装SDK时,它会仿真注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\OpenCL\Vendors。
Opencl程序在windows上执行时,它会先查看ICD的文件名,然后加载所需要的对应库文件。故,ICD库文件必须放在连接器的搜索路径下。ICD的默认搜索路径为:C:\Windows\system or
在windows上安装AMD显卡驱动。(起初安成CUDA的GPU驱动了)
Chapter1
Java的成功在于“一次编写,各处运行”;OPENCL秉性类似的理念:“一次编写、各设备上运行”因此,你不需要针对特定厂商的硬件,去学习他们的专用编程语言。而C、C++编写的程序只是在特定的编译目标上运行。
并发——顺序代码通过任务调度在进程(线程)间实现资源分享,并行执行。
并行编程——将不同的运算任务分配给不同的处理单元,同时并行执行。【在opencl中这些任务被称为内核】
内核——是针对一个或多个兼容Opencl的设备而特别编写的函数,并通过主机应用程序发送到相应的一个或多个设备上。
主机应用程序——是一个在我们称为主机的用户开发系统上运行的C/C++应用程序。主机可以将内核程序送到计算机显卡的GPU上执行也可以选择当前的cpu作为执行目标。
主机应用程序通过上下文(context)的容器来管理所连接的设备。主机必须从程序(program)的内核容器中选择函数,才能创建出内核函数,然后再向内核函数中调入相应的参数数据,并发送到指令序列的数据结构中。