首页 > 解决方案 > 我想在带有 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

标签: doparallel

解决方案


这是可能的,尽管由于那些随机内存访问,它会非常低效。简化了很多,当工作项(OpenCL 内核的实例)按顺序访问内存时,GPU 工作得更好。

话虽如此,要在 C 和 OpenCL 中执行此操作,您需要执行以下步骤(我再次简化了一下):

  • 包括 OpenCL 标头。
  • 编写 OpenCL 内核本身,或者将它放在一个字符串中,然后main()保存到一个.cl文件中,然后从main().
  • 获取所需的 GPU 设备并创建上下文。
  • 创建一个 OpenCL 命令队列。
  • 创建inputoutput设备缓冲区。
  • 将所需信息写入input设备缓冲区(通过命令队列)。
  • 创建一个 OpenCL 程序(从内核源字符串),构建它,获取内核对象并设置其参数。
  • 运行内核(通过命令队列),它将执行所需的操作,从input缓冲区读取并写入output缓冲区。
  • 从设备缓冲区读回数据output(通过命令队列)并将其显示在屏幕上。
  • 释放所有创建的 OpenCL 对象。

请参阅此链接,了解如何开始使用 OpenCL 和 GPU 计算。它很好地了解了如何完成这样的事情。您会注意到在纯 C 中执行此操作非常冗长,因此请使用cf4ocl 之类的包装库,使用C++,或使用具有更高级别绑定的其他语言(例如Python)。


推荐阅读