2016-12-19 6 views
0

私は自分のMACで完璧に動作するOpenCLコードを持っています。しかし、私はEC2のg2.2xlargeインスタンスへのポートにそれを、それはデバッグの多くの後OpenCLカーネル内の配列の宣言は機能しません。 (clBuildProgram(-11))

Exception 
ERROR: clBuildProgram(-11) 

を与えたときに、私はカーネルに構文エラーがあることが分かりました。

int size_a = POP_SIZE/4/numberOfDevices; 
int aliveIndividualsIndex[size_a]; 

私がしようとした場合::

int aliveIndividualsIndex[40]; 

それはあまりにもEC2インスタンス上で動作し、さらにそれを絞り込む後、私はエラーが次の行にあることがわかりました。

MACとEC2インスタンスが同じカーネルコードを処理する方法に違いがあるのはなぜですか?なぜ彼らの1人がコードを認識していて、もう1人が構文エラーを出すのですか?どうすれば修正できますか?私は[size_a]を使う必要があるからです。

どちらもOpenCL 1.2を使用しています。 gccやg ++などのバージョンに関する情報が必要な場合は、それらを提供してください。

+2

ことがありますCLで動的ランタイム・アレイを作成することは不可能です。コンパイル時には、メモリー・フットプリントを知って、カーネルに適切なメモリー割り振りを許可する必要があります。いくつかのプラットフォームの下でコードが失敗していない場合、それはCPU上で実行されるため、許容コンパイラを使用しているようです。 – DarkZeros

答えて

1

OpenCLカーネル内の配列のサイズは、コンパイル時に知る必要があります。

char * buildOptions;  // Should be allocated with enough space 
unsigned int numDevices; // Initialize with number of devices 
... 
// Use snprint instead if available 
sprintf(buildOption, "-D NUMBER_OF_DEVICES=%u", numDevices); 
... 
// Build program with specified compiler options 
clBuildProgram(prog, numDevices, deviceLst, buildOptions, NULL, NULL); 

それはまた必要かもしれは中size_aを一定にするために:そのように、あなたの問題を解決するために、例えば、"-D name=definition"オプションでclBuildProgram()機能のビルドオプションに渡すことでnumberOfDevicesコンパイル時定数を作りますカーネルのソースコード、例えば:

#define SIZE_A POP_SIZE/4/NUMBER_OF_DEVICES; 

あなたは今、カーネル内で配列を宣言することができます。

aliveIndividualsIndex[SIZE_A]; 
関連する問題