6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
1

Подключение openMP Visual Studio 2017

18.04.2018, 22:16. Показов 17907. Ответов 5

Author24 — интернет-сервис помощи студентам
Здравствуйте, ребята!

Ребят пытаюсь подключить openMP и протестировать. Создал проект С++, в свойствах проекта установил Поддержка openMP - "Да". Подключил библиотеку #include <omp.h>. Написал следующий код для тестирования:
C++
1
2
3
4
5
6
7
8
int main()
{
    #pragma omp parallel
    {
        cout << "Hellow World!!!\n"<<endl;
    }
    return 0;
}
Но в консоль выводится один раз, а не как предполагалось 4 раза (4 ядра).
Подскажите пожалуйста, что не правильно сделал?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2018, 22:16
Ответы с готовыми решениями:

Подключение библиотеки curl к Visual Studio 2017
У меня имеется проблема к подключению библиотеки curl к Visual Studio 2017. У меня имеются...

В коде возникли ошибки при переходе с Visual studio 2013 на Visual studio 2017
Добрый день, решил попробовать поменять свою 2013 студию на 2017 и заметил такую проблему, при...

Visual Studio 2017
Я пишу программу и комменитирую её и начинаю делать 2 задание, но иногда программа компилирует 1...

Visual Studio 2017
как сделать чтобы не показывало расположение файла

5
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
18.04.2018, 22:41 2
Ну так Вы нигде и не указали количество поков
C++
1
2
3
4
5
6
7
int main()
{
    omp_set_num_threads(4);
#pragma omp parallel
        cout << "Hello World!!!\n" << endl;
    return 0;
}
1
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
18.04.2018, 23:01  [ТС] 3
Цитата Сообщение от Hitoku Посмотреть сообщение
Ну так Вы нигде и не указали количество поков
Спасибо. А это мы задаём максимальное количество потоков?

Если нам нужно будет распараллелить умножение матрицы на вектор, то как нам заранее задать количество потоков?
C++
1
2
3
4
5
6
7
8
9
10
11
12
#pragma omp parallel for
  for (i=0; i<Size; i++) {
    c[i] = 0;
    for (j=0; j<Size; j++)‏
      c[i] += a[i][j]*b[j];
 
for (i=0; i<Size; i++) {
Sum = 0;
#pragma omp parallel for
    for (j=0; j<Size; j++)‏
Sum += a[i][j]*b[j];
    c[i] = Sum;
0
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
18.04.2018, 23:06 4
Vlad__i__mir, фрагмент из моего проекта по параллельному умножению матрицы на вектор. Обратите внимание на строки с комментариями
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
    virtual void Multiplication_OMP(MVector &vector, int threads) {
        int j;
        omp_set_nested(true);
        omp_set_num_threads(threads); //обратите внимание на эту строку
        int* v = new int[vector.GetLength()];
        vector.CopyTo(v);
        int* result = new int[n];
        n = n_start; m = m_start;
        while (n <= n_start * steps) {
            std::cout << "OpenMP Dense matrix-vector multiplication [" << n << ", " << m << "] (" << threads << " threads)...";
            double t_start = omp_get_wtime();
#pragma omp parallel for private (j) //и эту
            for (int i = 0; i < n; i++) {
                result[i] = 0;
                for (j = 0; j < m; j++)
                    result[i] += Matr[i, j] * v[j];
            }
            double t_stop = omp_get_wtime();
            n += n_start; m += m_start;
            std::cout << "\t>>>\t" << t_stop - t_start << " sec\n";
        }
        delete[] v;
        delete[] result;
    }
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
18.04.2018, 23:25  [ТС] 5
Сразу извините за несуразные вопросы, мы только начали изучать параллельное программирование.

Цитата Сообщение от Hitoku Посмотреть сообщение
omp_set_num_threads(threads); //обратите внимание на эту строку
Вы посчитали количество строк в матрице и соответственно создали такое количество потоков?

Цитата Сообщение от Hitoku Посмотреть сообщение
omp_set_nested(true);
А зачем нам прописывать вложенный параллелизм, если мы точно знаем сколько и какие потоки у нас будут?

Цитата Сообщение от Hitoku Посмотреть сообщение
#pragma omp parallel for private (j)
Что здесь означает "private (j)"? Для J мы значение не задали,только объявили.
0
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
18.04.2018, 23:31 6
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Вы посчитали количество строк в матрице и соответственно создали такое количество потоков?
Количество потоков я указываю вручную до выполнения этого метода, так что в Вашем случае там должна быть константа = 4
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
А зачем нам прописывать вложенный параллелизм, если мы точно знаем сколько и какие потоки у нас будут?
Вот тут хоть убете, не помню, каков сокральный смысл
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Что здесь означает "private (j)"? Для J мы значение не задали,только объявили.
Насколько я помню, это означает, что параллелиться будет цикл по j. По сути, если прописывать #pragma omp parallel for перед вложенным циклом, то private(j) можно опустить
1
18.04.2018, 23:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.04.2018, 23:31
Помогаю со студенческими работами здесь

Отладка visual studio 2017
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int reccurs1(int a) { if (a &lt;...

Graphics.h в Visual Studio 2017
Здравствуйте, возможно, кто-нибудь знает. Есть ли возможность использовать библиотеку graphics.h в...

Visual Studio 2017 Компилятор
Почему у меня нет компилятора как на видео? Отсутствуют элементы управления СБОРКА, ОТЛАДКА и пр.,...

Setlocale в visual studio 2017
Вчера пришлось перебить винду и с ней же переустановил visual studio, скачалась последняя версия...


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

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

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