我想在opencl-kernel中在GPU中运行此简单的C代码。有可能吗?
#include <stdio.h>
int main()
{
int a[15]={7,8,0,4,13,1,14,5,10,2,3,11,12,6,9};
int b[15];
printf(input datas: ");
for (i=0;i<15;i++) printf("%3d",a[i]);
printf("n");
for (i=0;i<15;i++) b[a[i]]=i;
for (i=0;i<15;i++) printf("%3d",b[i]);
printf("n");
return 0;
}
我的输入和输出数据应为:
Input: 7 8 0 4 13 1 14 5 10 2 3 11 12 6 9
Output: 2 5 9 10 3 7 13 0 1 14 8 11 12 4 6
是可能的,尽管由于这些随机内存访问,它确实会效率低下。简化了很多,当工作项目(OpenCL内核的实例(访问内存时,GPU会更好。
这样说,要在C和OpenCL中执行此操作,您需要执行以下步骤(同样,我简化了一点(:
- 包括opencl标题。
- 编写OpenCL内核本身,然后将其放入
main()
中的字符串中,将其保存到.cl
文件中,然后从main()
中读取字符串。 - 获得所需的GPU设备并创建上下文。
- 创建一个opencl命令队列。
- 创建
input
和output
设备缓冲区。 - 将所需信息写入
input
设备缓冲区(通过命令队列(。 - 创建一个OpenCL程序(来自内核源字符串(,构建它,获取内核对象并设置其参数。
- 运行内核(通过命令队列(,该内核将执行所需的操作,从
input
缓冲区读取并写入output
缓冲区。 - 从
output
设备缓冲区(通过命令队列(中读取数据并在屏幕上显示。 - 发布所有创建的OpenCL对象。
请参阅有关如何开始使用OpenCL和GPU计算的链接。它给出了很好的理论,说明了这样的事情。您会注意到,在纯C中这样做是非常详细的,因此要么使用包装库,例如CF4OCL ,使用C ,要么使用其他具有高级绑定的其他语言(例如Python(。