Мне нужна помощь в создании минимального примера, показывающего ускорение openMP в моей системе - PullRequest
2 голосов
/ 24 февраля 2012

Итак, после моей предыдущей попытки с openMP я понял, что у меня нет ни одного примера кода, который на самом деле работает быстрее в моей системе при распараллеливании по сравнению с последовательным интерфейсом. Ниже приведен краткий пример попытки (которая не удалась), сначала показывающая, что действительно есть два ядра, и что openMP использует их, а затем рассчитывающая время для двух «мертвых» задач, одна с использованием openMP, а другая - нет. Вполне возможно, что в задаче, над которой я тестирую, есть что-то не так, поэтому я был бы признателен, если бы кто-то смог провести еще один тест на работоспособность, просто чтобы я мог своими глазами увидеть, что многопоточность МОЖЕТ работать :)

#include <iostream>
#include <vector>
#include <ctime>
#include <cmath>

using namespace std;

#include <omp.h>

int main(int argc, char *argv[])
{


    //Below code will be run once for each processor (there are two)
    #pragma omp parallel 
    {
        cout << omp_get_thread_num() << endl; //this should output 1 and 0, in random order
    }


    //The parallel example:
    vector <double> a(50000,0);

    clock_t start = clock();
#pragma omp parallel for  shared(a) 
    for (int i=0; i < 50000; i++)    
    {
        double StartVal=i;

        for (int j=0; j<2000; ++j)
            a[i]=(StartVal + log(exp(exp((double) i)))); 
    } 

    cout<< "Time: " << ( (double) ( clock() - start ) / (double)CLOCKS_PER_SEC ) <<endl;

    //The serial example:
    start = clock();

    for (int i=0; i < 50000; i++)    
    {
        double StartVal=i;

        for (int j=0; j<2000; ++j)
            a[i]=(StartVal + log(exp(exp((double) i)))); 
    } 

    cout<< "Time: " << ( (double) ( clock() - start ) / (double)CLOCKS_PER_SEC ) <<endl;

    return 0;
}

вывод:

    1
    0
    Time: 4.07
    Time: 3.84

Может ли это быть связано с оптимизацией forloop, на которой отсутствует openMP? Или что-то не так с тем, как я измеряю время? В таком случае, у вас есть идеи для другого теста?

Заранее спасибо:)

EDIT: это действительно оказалось, что я плохо измерял время. Используя omp_get_wtime(), вывод становится:

1
0
Time: 4.40776
Time: 7.77676

Полагаю, мне лучше вернуться и еще раз взглянуть на мой старый вопрос ...

Ответы [ 2 ]

2 голосов
/ 25 февраля 2012

Существует две возможности:

  1. Если вы работаете в Linux.clock() не измеряет время стены в Linux.Он измеряет время процессора.
    Я предлагаю вам использовать omp_get_wtime().
  2. Ваш тест недостаточно велик.Попробуйте увеличить 2000 примерно до 200000.

Вот что я получаю в Windows, используя 200000 итерации во внутреннем цикле:

4
5
2
3
1
6
7
0
Time: 1.834
Time: 6.792

Myответ на на этот вопрос имеет очень простой пример OpenMP, который обеспечивает ускорение.

0 голосов
/ 25 февраля 2012

Как сказал Мистик, возможно, это именно то, как вы измеряете. В Linux вы можете использовать clock_gettime. Используя linux virtualbox с 4 ядрами (у меня 6 физических), я могу увеличить ваш код примерно в 3 раза, даже если внутренние циклы не превышают j <20. </p>

#include <sys/time.h>

int main( ... ) ... same as your code ...    
   timespec ts1;
   timespec ts2;

   //start measurement:
   clock_gettime(CLOCK_REALTIME, &ts1);

   ... code to time here ...

   //stop measurement:

   clock_gettime(CLOCK_REALTIME, &ts2);

   cout<< "clock Time s: " << (ts2.tv_sec-ts1.tv_sec) + 1e-9*( ts2.tv_nsec-ts1.tv_nsec ) <<endl;

  ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...