具有存储结果的

时间:2015-06-19 18:03:51

标签: 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;
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
        }
}
}

我已经减少了程序以使它适合这里。很多时候,如果我进行更改,并且我已经尝试了很多次,很多时候内部循环根本没有执行正确的次数而且累积等于32,532,849而不是10亿。对于上面的代码,缩放大约是2倍,但应该更高。

我希望代码简单地打破循环的第一个10000次迭代,以便每个线程并行运行一定数量的迭代(如果这可能是动态的,那将是很好的)并保存第二次迭代的结果循环到结果数组。第二个for循环由dependents组成,不能被破坏。目前“虚拟”迭代的顺序并不重要(只要所有三个索引都是切换,就可以用pos [3456]切换pos [345])但是我将不得不稍后对其进行修改,因此它很重要。

内循环中的众多变量和初始化让我非常困惑。内循环中有很多随机调用和函数/数学函数 - 这里有开销导致问题吗?我在Windows上使用GNU 4.9.2。

非常感谢任何帮助。

编辑:终于修好了。在第一个for循环中移动了RNG声明。现在我获得3.75x缩放到4个线程和5.72x缩放8个线程(超线程)。不完美,但我会接受它。我仍然认为线程锁定和同步存在问题。

......
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++)
    {
....

0 个答案:

没有答案