C++ 具有存储结果的OpenMP双for循环阵列

C++ 具有存储结果的OpenMP双for循环阵列,c++,arrays,for-loop,openmp,C++,Arrays,For Loop,Openmp,我花了很多时间浏览了其他帖子,但我仍然无法完成这个简单的程序 #include<iostream> #include<cmath> #include<omp.h> using namespace std; int main() { int threadnum =4;//want manual control int steps=100000,cumulative=0, counter; int a,b,c; float dum1, dum2, dum3; f

我花了很多时间浏览了其他帖子,但我仍然无法完成这个简单的程序

#include<iostream>
#include<cmath>
#include<omp.h>
using namespace std;

int main()
{
int threadnum =4;//want manual control
int steps=100000,cumulative=0, counter;
int a,b,c;
float dum1, dum2, dum3;
float pos[10000][3] = {0};
float non=0;
//RNG declared

#pragma omp parallel private(dum1,dum2,dum3,counter,a,b,c) reduction (+: non, cumulative) num_threads(threadnum)
{
    for(int dummy=0;dummy<(10000/threadnum);dummy++)
    {
            dum1=0,dum2=0,dum3=0;
            a=0,b=0,c=0;
            for (counter=0;counter<steps;counter++)
            {
                dum1 = somefunct1()+rand();
                dum2=somefunct2()+rand();
                dum3 = somefunct3(dum1, dum2, ...);

                a += somefunct4(dum1,dum2,dum3, ...);
                b += somefunct5(dum1,dum2,dum3, ...);
                c += somefunct6(dum1,dum2,dum3, ...);

                cumulative++; //count number of loops executed
            }
            pos[dummy][0] = a;//saves results of second loop to array
            pos[dummy][1] = b;
            pos[dummy][2] = c;
            non+= pos[dummy][0];//holds the summed a values
        }
}
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
int threadnum=4;//需要手动控制吗
整数步数=100000,累计=0,计数器;
INTA、b、c;
浮子dum1、dum2、dum3;
浮点位置[10000][3]={0};
浮点数=0;
//RNG声明
#pragma omp parallel private(dum1、dum2、dum3、counter、a、b、c)减少(+:非累积)num_线程(threadnum)
{

对于(int dummy=0;dummy您的pragma指令中似乎缺少一个
for
。它应该是我尝试过的其中一个。在并行之后插入for会产生错误。在第二个循环之前插入#pragma omp for只运行10000个/threadnum循环,加速比仍然没有变化。change
10000/threadnum
对于
10000
,因为openMP负责在线程之间划分循环{在pragma和forDone之间,它是有效的。但是,加速与原始代码完全相同,从1->4个线程加速2倍。某种原因导致了大量开销,我不知道这是什么。出于性能目的,1个线程计算8N,2个线程计算10N,4个线程计算15N,8个线程(超线程)给出20N。但是代码是完全独立的,我应该得到更好的加速。如果你选择组合的
#pragma omp parallel for…
,你应该删除环绕循环的额外的花括号集。OpenMP
for
构造要求循环立即跟随它,而不是块(即
{…}
)。您的pragma指令中似乎缺少一个
for
。它应该是我尝试过的其中一个。在并行之后插入for会产生错误。在第二个循环之前插入#pragma omp for只会运行10000个/threadnum循环,加速比仍然没有变化。change
10000/threadnum
for
10000,因为openMP负责在线程之间划分循环。此外,在第一个选项中,您将删除{在pragma和forDone之间,它是有效的。但是,加速与原始代码完全相同,从1->4个线程加速2倍。某种原因导致了大量开销,我不知道这是什么。出于性能目的,1个线程计算8N,2个线程计算10N,4个线程计算15N,8个线程(超线程)给出20N。但是代码是完全独立的,我应该得到更好的加速。如果你选择组合的
#pragma omp parallel for…
,你应该删除环绕循环的额外的花括号集。OpenMP
for
构造要求循环立即跟随它,而不是块(即
{…}
)。您的pragma指令中似乎缺少一个
for
。它应该是我尝试过的其中一个。在并行之后插入for会产生错误。在第二个循环之前插入#pragma omp for只会运行10000个/threadnum循环,加速比仍然没有变化。change
10000/threadnum
for
10000,因为openMP负责在线程之间划分循环。此外,在第一个选项中,您将删除{在pragma和forDone之间,它是有效的。但是,加速与原始代码完全相同,从1->4个线程加速2倍。某种原因导致了大量开销,我不知道这是什么。出于性能目的,1个线程计算8N,2个线程计算10N,4个线程计算15N,8个线程(超线程)给出20N。但是代码是完全独立的,我应该得到更好的加速。如果你选择组合的
#pragma omp parallel for…
,你应该删除环绕循环的额外的花括号集。OpenMP
for
构造要求循环立即跟随它,而不是块(即
{…}
)。
......
float non=0;    
#pragma omp parallel private(dum1,dum2,dum3,counter,a,b,c) reduction (+: non, cumulative) num_threads(threadnum)
{
    //RNG declared
    #pragma omp for
    for(int dummy=0;dummy<(10000/threadnum);dummy++)
    {
....