doparallel - 我想在带有 OpenCl 内核的 GPU 中运行这个简单的重新排序代码。可能吗?
问题描述
我想在 OpenCl 内核的 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)。
推荐阅读
- c# - 如何传递列表(sql join)以在c#中查看?
- javascript - 将 json 输出草绘到 html
- sql - 非联合查询列未按预期结果
- .net - Dapper 精确查询被发送到数据库引擎
- cuda - 测量 const 内存访问延迟会产生奇怪的结果
- java - 运行时 log4j.PropertyConfigurator 错误说找不到合适的方法用于配置(FileInputStream)
- c++ - 在 Visual Studio 上的 C++ 项目中将 NetCDF(通过 vcpkg 安装)与 CMake 一起使用时未解析的外部符号
- php - 在 Symfony 项目中包含 xml url 源的最佳方法
- php - 将表添加到数据库时如何插入手风琴
- javascript - 如何创建一个函数来搜索和创建一个json列表