并行因子计算

时间:2016-01-24 16:24:08

标签: c parallel-processing openmp factorial

我想编写一个使用并行计算(Open MP库)来计算整数阶乘的程序。

显然,下面的程序会受到竞争条件的影响。

// Each loop iteration writes a value that a different iteration reads.
#pragma omp parallel for
for (i=2; i < 10; i++)
{
   factorial[i] = i * factorial[i-1];
}

我在某处读到过pow和阶乘计算并不能平行完成,这是真的还是上面的程序(在C中,使用OPenMP库)可以修改来计算阶乘paralelley?

感谢。

2 个答案:

答案 0 :(得分:3)

您可以通过两次运行数组来并行执行此操作。第一次计算部分产品并保存每个线程的总部分产品。在第二遍中,您可以使用前一个主题中的总产品更正每个元素。这类似于如何并行执行累积和(即前缀和),除非它是并行的累积产品。

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>

int main(void) {
    int n = 10;
    int factorial[n];
    factorial[1] = 1;

    int *proda;
    #pragma omp parallel
    {
        int ithread = omp_get_thread_num();
        int nthreads = omp_get_num_threads();
        #pragma omp single
        {
            proda = malloc(nthreads * sizeof *proda);
            proda[0] = 1;
        }
        int prod = 1;
        #pragma omp for schedule(static) nowait
        for (int i=2; i<n; i++) {
            prod *= i;
            factorial[i] = prod;
        }
        proda[ithread+1] = prod;
        #pragma omp barrier
        int offset = 1;
        for(int i=0; i<(ithread+1); i++) offset *= proda[i];
        #pragma omp for schedule(static)
        for(int i=1; i<n; i++) factorial[i] *= offset;
    }
    free(proda);

    for(int i=1; i<n; i++) printf("%d\n", factorial[i]); putchar('\n'); 
}

答案 1 :(得分:1)

如果它是一个大数字,你可以做一个并行因子,如果你拆分乘法

示例

数字是1000!你有10个帖子

  1. 线程解析2 * 3 * 4 * 5 * ..... * 100并保存在t1
  2. 线程解析101 * 102 * 103 .... * 200并保存在t2

    ...

  3. 10)线程解析900 * 901 * 902 * .... * 1000并保存在t10

    然后在您解决的主线程上:

    t1 * t2 * t3 * ... * t10,它等于1000!