0 / 0 / 1
Регистрация: 16.07.2015
Сообщений: 28
1

Не работает директива omp for

29.01.2018, 10:50. Показов 981. Ответов 6
Метки нет (Все метки)

Здравствуйте!

Проблема такая, программа создает параллельные потоки и в таком варианте
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <omp.h>
#include <ctime>
//#include<omp_test.h>
#include<time.h>
#include<sys/time.h>
 
using namespace std;
 
int main()
{
    struct timeval ta, te ;
 
          gettimeofday(&ta,NULL);
           omp_set_num_threads(4);
 
       #pragma omp parallel
           {
 
             std::cout << "Hello World!" << '\n';
         
 
 
      }
 
           gettimeofday(&te,NULL);
 
           std::cout<<"runtime = "<<te.tv_sec - ta.tv_sec + (te.tv_usec - ta.tv_usec)/1000000.0<<'\n';
 
    return 0;
}
выводит
Hello World!
Hello World!
Hello World!
Hello World!
runtime = 0.000137
То есть потоки создаются в нужном количестве
Однако, стоит добавить в программу директиву omp for то
работа с циклом по времени не сокращается
код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <omp.h>
#include <ctime>
//#include<omp_test.h>
#include<time.h>
#include<sys/time.h>
 
using namespace std;
 
int main()
{
    struct timeval ta, te ;
 
          gettimeofday(&ta,NULL);
           omp_set_num_threads(4);
 
       #pragma omp parallel
           {
 
             std::cout << "Hello World!" << '\n';
          #pragma omp for schedule(dynamic,1000000)
           for(int i = 0; i<4000000; i++)
               for(int j =0; j<5000; j++)
                   int a =3;
 
 
      }
 
           gettimeofday(&te,NULL);
 
           std::cout<<"runtime = "<<te.tv_sec - ta.tv_sec + (te.tv_usec - ta.tv_usec)/1000000.0<<'\n';
 
    return 0;
}
В Windows до/после распараллеливания время выполнения кода составляло 34/8.5 секунд а в Ubuntu в обоих случаях 34. Среда QT в обоих случаях.
Только в Ubuntu после сборки выдает предупреждение
in function 'gomp_target_init':
Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
Про - файл
Код
EMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt



QMAKE_CC = /usr/bin/gcc-4.9
QMAKE_CXX = /usr/bin/g++-5
SOURCES += main.cpp

QMAKE_LIBS += -static -lgomp  # эти строки нужно дописать в makefile
QMAKE_CXXFLAGS+= -msse3 -fopenmp        #
QMAKE_LFLAGS += -fopenmp
LIBS += -lgomp -lpthread
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.01.2018, 10:50
Ответы с готовыми решениями:

C++ OMP Ошибка компилятора C3016 ругается на #pragma omp parallel for shared(A,B,C)
C++ OMP Ошибка компилятора C3016 ругается на #pragma omp parallel for shared(A,B,C) #include...

Почему не работает #pragma omp task?
Сижу быструю сортировку распараллеливаю. Использую подручные средства, а именно Visual Studio...

Не работает директива $I
Хочу проверить наличие файла, но паскаль воспримает директиву как комментарий. Что не так? В...

Не работает директива
Здравствуйте. Занимаюсь по книге Prata. Использую code::bloocks 17.12... Начал читать про шаблонный...

6
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
30.01.2018, 07:48 2
Тебе ж написали, при статической линковке с omp в рантайме нужно иметь доступ именно к той версии glibc, с какой статически слинковались.
Попробуй QMAKE_LIBS += -static -static-libgcc -lgomp
0
0 / 0 / 1
Регистрация: 16.07.2015
Сообщений: 28
30.01.2018, 17:52  [ТС] 3
Дописал. Эффект тот же
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
30.01.2018, 18:03 4
qmake выполнить не забыл?
0
0 / 0 / 1
Регистрация: 16.07.2015
Сообщений: 28
30.01.2018, 19:18  [ТС] 5
Выполнил. Не помогает
0
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
30.01.2018, 19:28 6
C++ (Qt)
1
QMAKE_LFLAGS += -static -static-libgcc
C++ (Qt)
1
QMAKE_LIBS += -lgomp
Добавлено через 1 минуту

Не по теме:

Отдельно замечу, под никсами не работал и статической сборкой не баловался. Быть может, нужно ещё чего дописать.

0
0 / 0 / 1
Регистрация: 16.07.2015
Сообщений: 28
31.01.2018, 09:33  [ТС] 7
Завтра попробую. О результатах напишу

Добавлено через 14 часов 3 минуты
То же предупреждение
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.01.2018, 09:33
Помогаю со студенческими работами здесь

Не работает директива dup
Здравствуйте, пытался на этом сайте : https://www.tutorialspoint.com/compile_assembly_online.php...

В проекте не работает директива using
Доброго дня. Не могу разобраться, проблема xamarin, или Visual Studio/с# в общем. Пытаюсь...

Не работает директива VirtualDocumentRoot
Доброго времени суток. Прошу помочь с непонятной для меня проблемой в apache2.4. Я недавно собрал...

Не работает директива proxy_cookie_path
Задачка простая: app выдает некие куки, и при этом он НЕ знает, по HTTP мы работаем, или по HTTPS -...

Как именно работает директива using?
Здравствуйте, уважаемые форумчане! Я изучаю основы языка C++ по книге С.Прата. Наткнулся на такой...

Не подключается dll. Директива using не работает
Скомпилировал длл, добавил ее в проект вместе с Xml файлом документации в след. папку Visual...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru