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