2012-05-12 31 views
1

我想变换功能,使其在平行的,而不是在C#中的顺序执行,但我不知道我做错了什么:C#转换顺序功能并行执行

// sequential 
static void Romberg(double a, double b, int n, double[,] R) 
{ 
    int i, j, k; 
    double h, sum; 

    h = b - a; 
    R[0, 0] = (h/2) * (f(a) + f(b)); 

    for (i = 1; i <= n; i++) 
    { 
     h = h/2; 
     sum = 0; 

     for (k = 1; k <= (Math.Pow(2.0, i) - 1); k += 2) 
     { 
      sum += f(a + k * h); 
     } 

     R[i, 0] = R[i - 1, 0]/2 + sum * h; 

     for (j = 1; j <= i; j++) 
     { 
      R[i, j] = R[i, j - 1] + (R[i, j - 1] - R[i - 1, j - 1])/(Math.Pow(4.0, j) - 1); 
     } 
    } 
} 


// parallel 
static void RombergCP(double a, double b, int n, double[,] R) 
{ 
    int i,j, k; 
    double h, sum; 

    h = b - a; 
    R[0, 0] = (h/2) * (f(a) + f(b)); 

    Parallel.For(0, n, options, i => 
    { 
     h = h/2; 
     sum = 0; 

     for (k = 1; k <= (Math.Pow(2.0, i) - 1); k += 2) 
     { 
      sum += f(a + k * h); 
     }; 

     R[i, 0] = R[i - 1, 0]/2 + sum * h; 

     for (j = 1; j <= i; j++) 
     { 
      R[i, j] = R[i, j - 1] + (R[i, j - 1] - R[i - 1, j - 1])/(Math.Pow(4.0, j) - 1); 
     } 
    }); 
} 

我得到的错误是“我”不能被声明,因为它会给“我”一个不同的含义,在“父或当前”范围中使用。 我试着将它重命名为i2并行函数,但它给出了相同的错误。提前致谢!

+0

我认为你必须与'H = H/2的问题;'在并行版本。 –

回答

1

几个问题:

  • 宣布在最小范围内可能存在变数。

  • 您的外循环从for (i = 1; i <= n; i++)变为Parallel.For(0, n, options, ...),这意味着R[i-1, ...]将抛出并行版本。

  • h = h/2;不是线程安全的。


// parallel 
static void RombergCP(double a, double b, int n, double[,] R) 
{ 
    //int i,j, k; 
    //double h, sum; 

    double h0 = b - a; 
    R[0, 0] = (h0/2) * (f(a) + f(b)); 

    Parallel.For(1, n, options, i => // start at 1 
    { 
    //h = h/2; 
    double h = (b - a)/Math.Pow(2, i); // derive from i 
    double sum = 0; 

    for (int k = 1; k <= (Math.Pow(2.0, i) - 1); k += 2) // keep k local 
     ... 
+0

@dtb - 或者仅仅除以Pow(2,i)。只要里面有'我'。 –

+0

谢谢!我明白我做错了什么,现在也行得通 – user573382

2

删除顶部的int i声明。它由下面的lambda声明。

+3

并将'j','k'和'​​sum'移到循环中。 –