我正在尝试使用cilk_for:
创建此代码的并行cilk代码c[0:2*n-1] = 0;
for (size_t i=0; i<n; ++i)
c[i:n] += a[i]*b[0:n];
串行代码:
for( size_t j=0; j<2*n-1; ++j )
c[j] = 0;
for (size_t i=0; i<n; ++i)
for( size_t j=0; j<n; ++j )
c[i+j] += a[i]*b[j];
例如:
x^2+x+1
2x^2+3x+5
C[0]=A[0]·B[0]
C[1]=A[0]·B[1]+A[1]·B[0]
.....
答案 0 :(得分:1)
最简单的方法是编写循环输出系数的cilk_for循环,并在循环内部为每个输出系数累积内积。
调用输出系数c [k]。循环看起来像:
cilk_for( k=0; k<2n-1; ++k )
c[k] = __sec_reduce( a[...:...]*b[...:...:-1] );
......需要是能够产生有助于每个输出系数的子部分的表达式。我有一个间歇性的互联网连接,所以我把它作为练习留给读者。
图书的下载网站(http://parallelbook.com/downloads)的递归版本比上面的方案渐近快。