この後、linkの配列の合計を計算するアトミック関数を実装しようとしました。したがって、自分自身のatom_add
関数(double型)を実装しました。ここでOpenCL - 制限付きまでのdouble型のアトミック演算
は使用カーネルのコードです:
#pragma OPENCL EXTENSION cl_khr_fp64: enable
#pragma OPENCL EXTENSION cl_khr_int64_base_atomics : enable
void atom_add_double(__global double *val, double delta)
{
union {
double f;
ulong i;
} old, new;
do
{
old.f = *val;
new.f = old.f + delta;
}
while (atom_cmpxchg((volatile __global ulong *)val, old.i, new.i) != old.i);
}
__kernel void sumGPU (__global const double *input,
__global double *finalSum
)
{
// Index of current workItem
uint gid = get_global_id(0);
// Init sum
*finalSum = 0.0;
// Compute final sum
atom_add_double(finalSum, input[gid]);
}
私の問題は、私はinput
配列のサイズのためにおよそ100000要素に到達するまで、カーネルコードが良い結果を生成していることです。
この制限を超える、計算はもはや有効ではない私のテストケースでは、私はループfor(i=0;i<sizeArray;i++) input[i]=i+1;
により入力配列を埋めるため、合計はsizeArray*(sizeArray+1)/2
に等しいので、(私は簡単に結果を確認することができます。
誰もがバグのこの種をすでに持っている?
は、私が定義し、カーネルコードにatom_add_double
のような機能を入れることはできますか?
をすべてのヘルプは大歓迎です、ありがとう
、減らすためにアトミックを使用していない、とのスレッドをロックアトミックを使用しないでください、彼らはさらに悪化しています。適切なリダクションコードまたはCL 2.0リダクション機能を使用してください。 https://www.khronos.org/registry/OpenCL/sdk/2.0/docs/man/xhtml/work_group_reduce.html アトミックを使用する場合と適切な並列削減を行う場合のパフォーマンスのペナルティは、少なくとも10倍です。 – DarkZeros