単純な並列加算器。配列の最初の要素へのポインター、配列の最後の要素へのポインター、最初のポインターの要素番号、および操作されている配列のこの部分の要素の数を渡します。
double my_func (double *x, double *x_last, int first_pos, int n)
{
if (n ==1) {
return x[first_pos];
}
else if (n == 2) {
return x[first_pos] + x[first_pos+1];
}
else {
double x1,x2;
x1 = _Cilk_spawn my_func (&x[first_pos], &x[n/2+first_pos-1],first_pos, n/2);
x2 = my_func (&x[n/2+first_pos],&x[first_pos+n-1],n/2+first_pos, n-n/2);
_Cilk_sync;
return x1 + x2;
}
}
サイズ80の配列から始めたとしましょう。これは、要素#0-19(第1四半期)で完全に機能し、要素#20-39以降のすべての要素に対して0の束/ガベージを返します。明らかにx1とx2の両方の線がある程度機能していますが、関数が機能しなくなっており、その理由はわかりません。何か案は?