OpenMP - назначить разные потоки двум для циклов в одной и той же параллельной области [duplicate]

Примером этого исключаемого исключения является: Когда вы пытаетесь проверить что-то, это null.

Например:

string testString = null; //Because it doesn't have a value (i.e. it's null; "Length" cannot do what it needs to do)

if (testString.Length == 0) // Throws a nullreferenceexception
{
    //Do something
} 

Время выполнения .NET исключение NullReferenceException при попытке выполнить действие над чем-то, что не было инстанцировано, т.е. код выше.

По сравнению с ArgumentNullException, которое обычно выбрано как защитная мера, если метод ожидает, что то, что происходит

Дополнительная информация находится в C # NullReferenceException и Null Parameter .

4
задан Jakub M. 27 October 2011 в 14:17
поделиться

3 ответа

OpenMP не может создавать параллельные области внутри параллельных областей. Это связано с тем, что OpenMP создает в начале программы параллельные потоки num_threads, в непараллельных областях остальные не используются и не спят. Они сделали это, так как частая генерация новых потоков довольно медленная по сравнению с пробуждением спящих потоков.

Поэтому вы должны распараллеливать только петли:

#include <omp.h>
#include "stdio.h"

int main()
{

omp_set_num_threads(10);

#pragma omp parallel for
    for(int i=0; i<5; i++) {
        printf("x %d\n", i);
    }

#pragma omp parallel for
    for(int i=0; i<5; i++) {
        printf(". %d\n", i);
    }
}
3
ответ дан tune2fs 31 August 2018 в 11:38
поделиться

Практически оптимальное количество потоков равно количеству доступных ядер процессора. Таким образом, каждая параллель должна обрабатываться во всех доступных ядрах, что невозможно внутри разделов omp. Итак, что вы пытаетесь достичь, не является оптимальным. Предложение tune2fs для выполнения двух циклов без секций имеет смысл и дает наилучшую производительность. Вы можете выполнять параллельные петли внутри других функций, но этот «обман» не дает повышения производительности.

1
ответ дан Alex F 31 August 2018 в 11:38
поделиться

Здесь вы должны использовать вложенный параллелизм. Проблема с omp for в sections заключается в том, что все потоки в области видимости должны принимать участие в omp for, и они явно не видят; они разбиты по разделам. Таким образом, вы должны вводить функции и выполнять вложенные параллелизм внутри функций.

#include <stdio.h>
#include <omp.h>

void doTask1(const int gtid) {
    omp_set_num_threads(5);
#pragma omp parallel 
    {
        int tid = omp_get_thread_num();
        #pragma omp for
        for(int i=0; i<5; i++) {
            printf("x %d %d %d\n", i, tid, gtid);
        }
    }
}

void doTask2(const int gtid) {
    omp_set_num_threads(5);
#pragma omp parallel 
    {
        int tid = omp_get_thread_num();
        #pragma omp for
        for(int i=0; i<5; i++) {
            printf(". %d %d %d\n", i, tid, gtid);
        }
    }
}


int main()
{
    omp_set_num_threads(2);
    omp_set_nested(1);

#pragma omp parallel    
    {
        int gtid = omp_get_thread_num();
#pragma omp sections
        {
#pragma omp section
            doTask1(gtid);

#pragma omp section
            doTask2(gtid);
        } // end parallel and end sections
    }
}
6
ответ дан Jakub M. 31 August 2018 в 11:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: