AMD OpenCL プログラミング ガイド、セクション 6.3 定数メモリの最適化:
グローバル スコープの定数配列。これらの配列は、初期化され、グローバル スコープであり、一定のアドレス空間にあります (OpenCL 仕様のセクション 6.5.3 で指定されています)。配列のサイズが 64 kB 未満の場合、配列はハードウェア定数バッファーに配置されます。それ以外の場合は、グローバル メモリを使用します。この例は、数学関数のルックアップ テーブルです。
この「グローバルスコープの定数配列」を使いたいです。私は純粋なCでそのようなコードを持っています
#define SIZE 101
int *reciprocal_table;
int reciprocal(int number){
return reciprocal_table[number];
}
void kernel(int *output)
{
for(int i=0; i < SIZE; i+)
output[i] = reciprocal(i);
}
OpenCLに移植したい
__kernel void kernel(__global int *output){
int gid = get_global_id(0);
output[gid] = reciprocal(gid);
}
int reciprocal(int number){
return reciprocal_table[number];
}
グローバル変数をどうすればいいですreciprocal_table
か? __global
または追加しようとすると__constant
、エラーが発生します。
global variable must be declared in addrSpace constant
__constant int *reciprocal_table
からkernel
に渡したくありませんreciprocal
。どういうわけかグローバル変数を初期化することは可能ですか? コードに書き留めることができることは知っていますが、他の方法はありますか?
PS私はAMD OpenCLを使用しています
UPD上記のコードは単なる例です。多くの機能を備えた、はるかに複雑なコードがあります。そのため、プログラムスコープで配列を作成して、すべての関数で使用したいと考えています。
UPD2サンプル コードを変更し、プログラミング ガイドからの引用を追加