Arrays 英特尔Cilk Plus数组表示法的奇怪复制行为

Arrays 英特尔Cilk Plus数组表示法的奇怪复制行为,arrays,parallel-processing,cilk,cilk-plus,Arrays,Parallel Processing,Cilk,Cilk Plus,我正在使用Intel Cilk Plus数组表示法练习向量编程。 但是,我遇到了数组指定的奇怪复制行为 要解决的问题是并行前缀。D为输入,P为输出 //错误的结果代码。在英特尔icc 14.0.2上测试 void vec_prefix(int n, int D[n], int P[n]) { P[0:n] = D[0:n]; //initial copy int bound=1; int * Buf1 = _mm_malloc(n*sizeof(int), 16); int *

我正在使用Intel Cilk Plus数组表示法练习向量编程。 但是,我遇到了数组指定的奇怪复制行为

要解决的问题是并行前缀。D为输入,P为输出

//错误的结果代码。在英特尔icc 14.0.2上测试

void vec_prefix(int n, int D[n], int P[n]) {
  P[0:n] = D[0:n]; //initial copy
  int bound=1;
  int * Buf1 = _mm_malloc(n*sizeof(int), 16);
  int * Buf2 = _mm_malloc(n*sizeof(int), 16);

  while(bound<n){
    Buf1[0:n-bound] = P[0:n-bound];
    Buf2[0:n-bound] = P[bound:n-bound];
    //printf("WHY??\n");  //Add this fence, the result will be correct.
    P[bound:n-bound] = Buf1[0:n-bound] + Buf2[0:n-bound];
    bound<<=1;
  }
  _mm_free(Buf1); _mm_free(Buf2);
}
void vec_前缀(int n,int D[n],int P[n]){
P[0:n]=D[0:n];//初始副本
int-bound=1;
int*Buf1=_mm_malloc(n*sizeof(int),16);
int*Buf2=_mm_malloc(n*sizeof(int),16);

虽然(bound您的代码在我看来是正确的。不需要“围栏”。我向英特尔编译器组提交了一份内部错误报告,并提供了一个所有错误的示例作为输入。谢谢您的示例

如果编译器工作正常,您甚至可以将while循环缩短为:

while(bound<n){
    Buf1[0:n-bound] = P[0:n-bound];
    P[bound:n-bound] = Buf1[0:n-bound] + P[bound:n-bound];
    bound<<=1;
}

while(谢谢你的帮助!
while(bound<n){
    Buf1[0:n-bound] = P[0:n-bound];
    P[bound:n-bound] = Buf1[0:n-bound] + P[bound:n-bound];
    bound<<=1;
}