私は OpenCL の初心者ですが、オンラインで見つけた多くの例でうまくいきました。私のアプリケーションは非常に基本的なバイオインフォマティクスなので、おそらく 1 ~ 3MB の長さの「ACTCGAAAGGTA....」という非常に長い文字列に関心があります。簡単な計算は、A、T、C、G 要素の数を数えることであり、OpenCL に非常に適しているようです。したがって、ここにある標準的な「2つのベクトルを追加する」例から始めると
__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 がすべての魔法をかけてくれるのでしょうか?