Итак, отвечая на мой вопрос, спасибо @AlexG за предоставленную информацию.См. Раздел комментариев к вопросу.
Это проблема Microsoft Visual Studio и Windows.
Первое чтение Группы процессоров для Windows .
В основном,если у вас менее 64 логических ядер, это не будет проблемой.Однако, как только вы пройдете через это, у вас будет две группы процессов для каждого сокета (или другой организации, которую Windows выберет).В моем случае каждая группа процессов имела 44 гиперпотока и представляла один физический сокет ЦП, и у меня было ровно две группы процессов.Каждому процессу (программе) по умолчанию предоставляется доступ только к одной группе процессов, поэтому изначально я мог использовать только 44 потока на одном ядре.Однако если вы вручную создаете потоки и используете SetThreadGroupAffinity, чтобы установить группу процессоров потока, которая отличается от первоначально назначенной группы вашей программы, то ваша программа теперь становится многопроцессорной группой.Это похоже на обходной путь для включения многопроцессорных систем, но да, это как это сделать.Вызов GetProcessGroupAffinity покажет, что число групп становится больше 1, как только вы начинаете устанавливать отдельную группу процессов каждого потока.
Мне удалось создать открытый блок MP, подобный этому, и пройти и назначить группы процессов:
...
#pragma omp parallel num_threads( 88 )
{
HANDLE thread = GetCurrentThread();
if (omp_get_thread_num() > 32)
{
// Reserved has to be zero'd out after each use if reusing structure...
GroupAffinity1.Reserved[0] = 0;
GroupAffinity1.Reserved[1] = 0;
GroupAffinity1.Reserved[2] = 0;
GroupAffinity1.Group = 0;
GroupAffinity1.Mask = 1 << (omp_get_thread_num()%32);
if (SetThreadGroupAffinity(thread, &GroupAffinity1, &previousAffinity))
{
sprintf(buf, "Thread set to group 0: %d\n", omp_get_thread_num());
OutputDebugString(buf);
}
}
else
{
// Reserved has to be zero'd out after each use if reusing structure...
GroupAffinity2.Reserved[0] = 0;
GroupAffinity2.Reserved[1] = 0;
GroupAffinity2.Reserved[2] = 0;
GroupAffinity2.Group = 1;
GroupAffinity2.Mask = 1 << (omp_get_thread_num() % 32);
if (SetThreadGroupAffinity(thread, &GroupAffinity2, &previousAffinity))
{
sprintf(buf, "Thread set to group 1: %d\n", omp_get_thread_num());
OutputDebugString(buf);
}
}
}
Итак, с помощью приведенного выше кода мне удалось запустить 64 потока, по 32 потока на каждый сокет.Теперь я не смог получить более 64 потоков, хотя пытался принудительно установить omp_set_num_threads равным 88. Причина, по-видимому, связана с реализацией OpenMP в Visual Studio, которая не позволяет использовать более 64 потоков OpenMP.Вот ссылка на это для получения дополнительной информации
Спасибо всем за помощь в подборе еще нескольких лакомых кусочков, которые помогли в конечном ответе!