2016-11-19 5 views
0

で最後のタスクのために働きます[0 ...size - 1]の配列ですが、最後のインデックスを適切な値に設定するだけです。他のものはデフォルトのままです(私の場合0)。は、私だけがこのような単純なカーネルを持っているキュー

私は、アレイ(grid[0] += idx)の最初のセルにidxパラメータの値を蓄積しようと、それは1からsize - 1に私に整数の予想合計を与えたので、パラメータが正しく渡されると、タスクが正しく実行されます。

ご協力いただきましてありがとうございます。

+0

私はうまく動作する 'clEnqueueNDRangeKernel'を使ってしまいました。この場合、なぜタスクの並列処理が機能しなかったのかまだ分かりません。 'clEnqueueTask'は、Intelによって実装されたOpenCLで廃止予定とマークされていますが、問題とは関係ありません。 – Lev

答えて

1

あなたの問題の原因に可能な提案:

arg整数は、完全なループの間に同じメモリアドレスを持っています。 CLカーネルに渡すときには、(値のコピーではなく)アドレスを渡すので、値はすべてのインスタンスごとに毎回変わります。

これは、すべてのグリッド配列の値が、最後の値を除いてゼロではなく、同じ、最後の値に等しいことを示唆しています。

合計を計算するときに、なぜこれが機能しますか? 私の推測では、grid配列内に個々の値を格納していないということです(カーネルが終了してデータが読み込まれた後に保持する必要があります)。代わりに、値が追加されてgrid[0]に割り当てられ、grid[0]の値はそれ以上idxに依存しません。

確かに、これはやや曖昧であり、いくつかの当て推量を必要とするが、ここであなたが試すことができるものです。

for (int i = 0; i < size; i++) { 
    int *arg = malloc(sizeof(*arg)); 
    *arg = i; 
    clSetKernelArg(kernel_id, 1, arg, sizeof(*arg)); 
    clEnqueueTask(command_queue, kernel_id, 0, NULL, NULL); 
} 

(何らかの理由で、あなたの例ではclSetKernelArgsize引数を持っていません。理由はわかりません。) 明らかに通常は、argをサイズsizeの配列として割り当てます。繰り返しするたびにmallocするのではなく、この例を工夫しておきましょう。

これがうまくいくと、あなたは何かを見ることができます。freeargこれはかなりのメモリリークです。そしてループ内でargを解放することはできません。

関連する問題