0

简单的并行加法器。您将指向数组中第一个元素的指针、指向数组中最后一个元素的指针、第一个指针的元素 # 以及正在操作的数组的这一部分中的元素数传递给它。

    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(第一季度)非常有效,然后为元素 #20-39 和之后的所有元素返回一堆 0/垃圾。显然,x1 和 x2 线都在某种程度上工作,但功能出现故障,我不知道为什么。有任何想法吗?

4

1 回答 1

3

您对数组进行了错误的切片:

x1 = my_func (&x[n/2+first_pos],&x[first_pos+n-1],n/2+first_pos, n-n/2);
                    ^                                 ^
            new "base" pointer                first pos in slice?!

您不能同时将调整后的指针传递给切片的第一个元素,以及该元素的全局索引。可以说,您最终会多次编制索引,从而导致无效地址被取消引用。

对于 的情况n = 80,第二个递归调用将通过x指向元素&x[80/2+0],即&x[40],但它也将设置first_pos为该40调用。最终你会到达n < 3,并使用累积索引first_pos

此外,为了清楚起见,输入数据应该是const只读的。

于 2013-02-12T11:25:27.940 回答