本节书摘来异步社区《OpenCL实战》一书中的第1章,第1.4节,作者: 【美】Matthew Scarpino 译者: 陈睿 责编: 陈冀康,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.4 OpenCL应用程序的第一印象
现在,你应该对OpenCL的目标有了一个大致的了解。我还希望你能对OpenCL应用程序的运行过程有所认识。但如果想要更全面而深入地认识OpenCL,你还需要仔细阅读源代码。
这一节将看到两个OpenCL源代码文件,一个是针对主机,一个是针对设备。两个程序一起完成对44矩阵和41向量的矩阵乘积运算。这项操作对图像处理很重要。其中矩阵表示的是转换,而向量表示的是颜色或是空间中的点。图1.3所示的是矩阵-向量乘积的运算过程,以及运算结果。
如果打开本书示例代码的路径,你会在Ch1文件夹中找到这两个源程序文件。第一个文件matvec.c是在主处理器上执行,它将创建一个内核,然后将其发送给找到的第一个设备。下面所示的主机上运行的程序代码。注意,源代码是用C语言编写的。
注意,下面的源文件代码已经略去了查错例程的内容,完整的代码参见本书的示例代码中的matvec.c文件。
源文件虽长,但并不复杂。代码的大部分都是在创建OpenCL的数据结构,其中的命名约定如下:cl_context是前面讨论的上下文,cl_platform_id是前面讨论的平台,cl_device_id是前面讨论的设备等。了解这些命名约定之后,代码在主机程序间的复制就显得很简单。
不同的是,cl_program和cl_kernel的创建则因应用程序的不同而不同。程序1.1中,应用程序通过文件matvec.cl里的函数来创建内核程序。更准确地讲,主机将matvec.cl以字符的形式读到一个字符数组中,通过这个字符数组创建出程序,编译整个程序。然后,通过其中的函数matvec_mult完成对内核的创建。
文件matvec.cl中的内核代码比文件matvec.c中的主机代码短很多,而且一个函数matvec_mult便完成了整个矩阵-向量相乘的算法(见程序1.2)。
第2章和第3章我们将讨论如何编写出程序1.1那样的主机应用程序。第4章和第5章我们将讨论如何编写出程序1.2那样的内核函数。
如果你已经迫不及待地想编译这两个应用程序,实现点乘算法,我建议你先看看附录A,里面讨论了如何获取、安装OpenCL开发工具。在此之前,我觉得对OpenCL标准有一个概括性的认识还是很有必要的,我们将在下一节来展开讨论。