C++ 调和级数和c++;MPI与OpenMP
我正试图用MPI和OPEMP来做一个“调和级数和”问题的并行版本。但在不同的过程中,输出是不同的 有人能帮我解决这个问题吗 并行程序:(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) { ...
这里有一个错误:
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)
...
}