Примером этого исключаемого исключения является: Когда вы пытаетесь проверить что-то, это 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 .
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);
}
}
Практически оптимальное количество потоков равно количеству доступных ядер процессора. Таким образом, каждая параллель должна обрабатываться во всех доступных ядрах, что невозможно внутри разделов omp. Итак, что вы пытаетесь достичь, не является оптимальным. Предложение tune2fs для выполнения двух циклов без секций имеет смысл и дает наилучшую производительность. Вы можете выполнять параллельные петли внутри других функций, но этот «обман» не дает повышения производительности.
Здесь вы должны использовать вложенный параллелизм. Проблема с 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
}
}