2012-03-14 9 views
1

私は、小さなライブラリを作ろうとすると、C++バインディングを使ってOpenCLを書いています。OpenCL enqueTask vs enqueNDRangeKernel

NDRange offset(0); 
NDRange global_size(numWorkItems); 
NDRange local_size(1); 

//this call fails with error code -56 
err = queue.enqueueNDRangeKernel(kernelReduction, offset, global_size, local_size); 
//this call works: 
err = queue.enqueueTask(kernelReduction); 

ここで、エラーコード-56はCL_INVALID_GLOBAL_OFFSETです。そして私は最初の呼び出しが失敗する理由を知りません。助言がありますか?

+0

どのディメンションを使用していますか? OpenCLのドキュメントによると、オフセットは整数オフセットの配列でなければならず、それぞれが特定の次元に対応している必要があります。 – Thomas

+0

C++バインディングで理解できる限り、NDRangeイニシャライザによって提供されています。 1の整数が与えられれば1次元とみなされ、2の場合は2と仮定されます。 –

答えて

1

global_work_offsetはNULLにする必要があります。ここの値はCL_INVALID_GLOBAL_OFFSETを生成します。

はそれをチェックアウト:clEnqueueNDRangeKernel

+0

グローバルオフセットが実際に実装されておらず、ヌルでなければならないOpenCL 1.0のドキュメントを見ています。これは、OpenCL 1.1および1.2(グローバルオフセットが動作している)では当てはまりません。 – Thomas

+1

質問でバージョンが指定されていないので、これが私の推測です。 – mfa

2

をあなたはOpenCLの1.0を使用している場合、あなたは(あなたが一定のメモリカウンタか何かを使用することによって回避する必要があります)私の知る限りでグローバルオフセットを使用することはできません。自動的に適応しない場合は、OpenCL 1.1へのバインディングを更新して、ドライバを更新するようにしてください。