0

我是一名 OpenCL 新手,但我在网上找到的许多示例都取得了很好的成功。我的应用程序是非常基本的生物信息学,所以我关心很长的“ACTCGAAAGGTA....”字符串,可能有 1-3MB 长。一个简单的计算是计算 A、T、C、G 元素的数量,这似乎非常适合 OpenCL。因此,如果我从此处找到的规范“添加两个向量”示例开始

__kernel void vector_add_gpu (__global const float* src_a,
                     __global const float* src_b,
                     __global float* res,
               const int num)
{
   const int idx = get_global_id(0);
   if (idx < num)
      res[idx] = src_a[idx] + src_b[idx];
}

我的问题是,我是否需要以任何方式在工作组或工作单元之间拆分原始字符串?我确实理解对 idx < num 的检查,所以我得到了工作项“知道”它是否在范围内的概念。为我管理这个是 OpenCL 的工作吗?是否存在我需要明确管理将全局数据拆分为块的情况?也许如果它们超过一定大小?(可能是由我的硬件限制决定的?)

在浪费大量时间之前,我想弄清我的基本 OpenCL 概念 :)

TL;DR:我是否必须拆分“大”输入数据字符串?还是 OpenCL 为我做了所有这些魔法?

4

1 回答 1

2

您可以像在纯 C 代码中一样访问这些数组,不一定需要以任何方式对输入数组进行分区。如果您通过全局线程 id 访问数组,它将是全局工作池中的唯一索引,它会为您处理分区。

需要注意的事情是确保您不会阅读超出数组末尾的内容,因为您可能必须填充最后的工作组,但您似乎很好地理解了那部分。

于 2012-09-30T16:56:36.017 回答