Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调和级数和c++;MPI与OpenMP_C++_Multithreading_Parallel Processing_Mpi_Openmp - Fatal编程技术网

C++ 调和级数和c++;MPI与OpenMP

C++ 调和级数和c++;MPI与OpenMP,c++,multithreading,parallel-processing,mpi,openmp,C++,Multithreading,Parallel Processing,Mpi,Openmp,我正试图用MPI和OPEMP来做一个“调和级数和”问题的并行版本。但在不同的过程中,输出是不同的 有人能帮我解决这个问题吗 并行程序:(MPI和OpenMP) 输出: 输入: 输出: 这里有一个错误: void HPS(char* output) { ... reduce(digits); slave(digits); ... } 您应该首先计算,然后执行缩减,而不是相反的方式。改为: void HPS(char* output) { ...

我正试图用MPI和OPEMP来做一个“调和级数和”问题的并行版本。但在不同的过程中,输出是不同的

有人能帮我解决这个问题吗

并行程序:(MPI和OpenMP)

输出:

输入:

输出:


这里有一个错误:

void HPS(char* output) {
    ...
    reduce(digits);
    slave(digits);

    ...
}
您应该首先计算,然后执行缩减,而不是相反的方式。改为:

void HPS(char* output) {
    ...

    slave(digits);
    reduce(digits);
    ...
}
由于您希望使用MPI+OpenMP,您也可以保留以下内容:

for (i = idP+1; i <= n; i+=numP)
for(i=idP+1;i
#define d 12
#define n 7
2,592857142857
void HPS(char* output) {
    ...
    reduce(digits);
    slave(digits);

    ...
}
void HPS(char* output) {
    ...

    slave(digits);
    reduce(digits);
    ...
}
for (i = idP+1; i <= n; i+=numP)
 #pragma omp parallel for private(remainder)
 for (digit = 0; digit < d + 11 && remainder; ++digit) 
    for (i = idP+1; i <= n; i+=numP){
        remainder = 1;
        #pragma omp parallel for private(i, remainder, digit)
        for (digit = 0; digit < d + 11 && remainder; ++digit) {
            long unsigned int div = remainder / i;
            long unsigned int mod = remainder % i;
            #pragma omp atomic
            digits[digit] += div;
            remainder = mod * 10;
        }
    }
int idT = omp_get_thread_num();      // Get the thread id
int numT = omp_get_num_threads();    // Get the number of threads.
int numParallelTask = numT * numP;   // Number of parallel task
int start = (idP+1) + (idT*numParallelTask); // The first position here each thread will work

#pragma omp parallel
{

for (i = start; i <= n; i+=numParallelTask)

...
}