0

我正在尝试使用 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]
.....
4

1 回答 1

1

最简单的方法是编写一个循环输出系数的 cilk_for 循环,并在循环内部为每个输出系数累积一个内积。

调用输出系数 c[k]。循环将如下所示:

cilk_for( k=0; k<2n-1; ++k ) 
    c[k] = __sec_reduce( a[...:...]*b[...:...:-1] );

... 需要是产生对每个输出系数有贡献的子部分的表达式。我有一个断断续续的互联网连接,所以我把它作为练习留给读者。

这本书的下载站点 ( http://parallelbook.com/downloads ) 有一个递归版本,它比上述方案渐进地快。

于 2013-11-04T17:29:50.120 回答