Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
1

VS 12 ограничение на создание потоков

05.03.2014, 19:59. Просмотров 1520. Ответов 26
Метки нет (Все метки)

Использую реализацию OpenMP для распараллеливания вычислений. Почему то больше 64 потоков не создает. 2х ядерный процессор, 3гб оперативки, но ни в какую не хочет создавать 100,200,300 потоков? подскажите, может в настройках что поменять надо или какие библиотеку подключить? просто это точно дело не в OpenMP так как видел примеры реализации с большим кол-вом потоков. Что это может быть за ограничение?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2014, 19:59
Ответы с готовыми решениями:

Создание и завершение процессов и потоков. Приоритеты выполнения потоков
Здравствуйте. Буду очень раз если поможете понять,что конкретно нужно сделать в...

Создание потоков
Всем доброго времени суток. Как всегда, последняя надежда на этот сайт. Сразу к...

Создание потоков
Здравствуйте, я создал два потока, но не знаю, как можно проверить, точно ли я...

Создание потоков в openmp
Доброго времени суток. Мне удалось распараллелить цикл for, но внутри данного...

Динамическое создание потоков
Задача поиска максимума в большом массиве данных. Для поиска использовать...

26
mustimur
268 / 222 / 72
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
05.03.2014, 20:25 2
Цитата Сообщение от RayPas Посмотреть сообщение
100,200,300 потоков
А смысл в таком количестве потоков? Теоретически каждый из потоков может задействовать одно ядро на 100%, поэтому создавать кучу потоков (больше числа ядер процессора), которые к тому же требуют синхронизации, смысла особых не вижу. Хотя для вычислений создать их можно но только на GPU, а не на CPU...
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
05.03.2014, 20:27  [ТС] 3
mustimur, по заданию столько надо...
0
mustimur
268 / 222 / 72
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
05.03.2014, 20:48 4
Я расчеты делал на Cuda, там и больше было (хотя поток то я формально использовал один) но блоков и нитей было много (больше вашего)...А они и есть по сути потоки, хотя и называются по другому.
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
05.03.2014, 20:50  [ТС] 5
mustimur, ну нити, потоки, не суть. суть в том, что боьше 64 не создается...а почему...
вопрос все еще актуален
0
mustimur
268 / 222 / 72
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
05.03.2014, 21:02 6
Я с OpenMP не работал, а когда надо было потоки создать на CPU, использовал CreateThread, но таким количество не пробовал создавать (хотя в роде не видел ограничений явных), но и смысла не видел в этом. Так что не знаю

Другой вопрос использование вычислительных возможностей процессора видеокарты, там мной создавалось куча параллельных блоков, но это другой подход...
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
05.03.2014, 21:04  [ТС] 7
mustimur, я вас понял, ну сам не видел явных ограничений на вообще любые подходы, так что тут происходит сам не понял, кажетя что-то в самой VS
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,117
Записей в блоге: 10
Завершенные тесты: 1
05.03.2014, 23:32 8
Функция int omp_get_thread_limit() что выдаёт?
Цитата Сообщение от RayPas Посмотреть сообщение
Использую реализацию OpenMP для распараллеливания вычислений. Почему то больше 64 потоков не создает.
Как используете? Как узнаёте что больше 64-х потоков не создаётся?
На эти вопросы Вам надо было ответить еще в первом посте.
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
05.03.2014, 23:36  [ТС] 9
castaway,
задаю явно и не явно
C++
1
omp_set_num_threads(100);
а узнаю так, что вывожу на консоль
C++
1
cout << "Kol-vo potokov: "<< omp_get_num_threads() << endl;
там больше 64 не выводит
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,117
Записей в блоге: 10
Завершенные тесты: 1
05.03.2014, 23:48 10
void omp_set_num_threads( int ) задаёт маскимальное число потоков.
int omp_get_num_threads() возвращает число активных потоков.
Логично что число активных потоков меньше или равняется числу максимальных.
Без простейшего кода, воспроизводящего "проблему", говорить не о чем..
Цитата Сообщение от castaway Посмотреть сообщение
Функция int omp_get_thread_limit() что выдаёт?
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
05.03.2014, 23:49  [ТС] 11
castaway,

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
 cout << "V kakoe Kol-vo potokov poschet?"<<endl;
  cin >> count;
    
 
     omp_set_num_threads(count);
        
int k,l;
start = omp_get_wtime();
    #pragma omp parallel
    {
#pragma omp for schedule(dynamic,1) 
   for (i=0; i<100; i++) {
           k=i/10;
           l=i%10;
          c[k][l] = a[k][l] * b[k][l];
          cout << "Thread: "<< omp_get_thread_num() << " i= " << k << " j= " << l << endl;
          
    cout << "Kol-vo potokov: "<< omp_get_num_threads() << endl;
        }
   #pragma omp barrier
    }
    end = omp_get_wtime();
    cout << "Time: " << end-start<<endl;
    cout << "Kol-vo potokov: "<< omp_get_num_threads() << endl;
0
Убежденный
Ушел с форума
Эксперт С++
15998 / 7269 / 1180
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
05.03.2014, 23:50 12
Цитата Сообщение от RayPas Посмотреть сообщение
Что это может быть за ограничение?
E. Implementation-Defined Behaviors in OpenMP C/C++
http://msdn.microsoft.com/en-us/library/cz27w838%28v=vs.110%29.aspx
Number of threads: If a parallel region is encountered while dynamic adjustment of
the number of threads is disabled, and the number of threads requested for the
parallel region exceeds the number that the run-time system can supply, the
behavior of the program is implementation-defined (see page 9).

In Visual C++, for a non-nested parallel region, 64 threads (the maximum) will be provided.
Цитата Сообщение от RayPas Посмотреть сообщение
ну нити, потоки, не суть. суть в том, что больше 64 не создается...а почему.
640 килобайт 64 потока хватит всем (c)
2
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
05.03.2014, 23:55  [ТС] 13
castaway, что то на эту функцию он ругается и пишет - неразрешенный элемент...omp.h подключено...все работает, но только на 64 потока

Добавлено через 49 секунд
Убежденный, ну так был пост, в котром человек создавал и 300 потоков с помощью этой организации
0
DU
1486 / 1132 / 164
Регистрация: 05.12.2011
Сообщений: 2,279
05.03.2014, 23:56 14
delete
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,117
Записей в блоге: 10
Завершенные тесты: 1
06.03.2014, 00:05 15
Собственно, Убежденный нашел правильный источник. Переведу следующий фрагмент.
Цитата Сообщение от Убежденный Посмотреть сообщение
In Visual C++, for a non-nested parallel region, 64 threads (the maximum) will be provided.
В Visual C++, для не вложенного участка parallel, будет предоставлено 64 потока (максимум).
* под "участком" так же подразумевается слово "team" (команда потоков) из источников OpenMP.
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
06.03.2014, 00:07  [ТС] 16
castaway, т.е. мне мои циклы в 100 потоков никак не посчитать?
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,117
Записей в блоге: 10
Завершенные тесты: 1
06.03.2014, 00:24 17
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <omp.h>
 
int main()
{
    omp_set_num_threads( 100 );
 
    #pragma omp parallel for
    for ( int i = 0; i < 100; i++ ) {
        if ( i == 99 )
            std::cout << omp_get_num_threads() << std::endl;
    }
    return 0;
}
Что выдаёт этот код?
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
06.03.2014, 00:27  [ТС] 18
castaway, 64
0
DU
1486 / 1132 / 164
Регистрация: 05.12.2011
Сообщений: 2,279
06.03.2014, 00:31 19
еще можно разрулить переменными окружения:
http://software.intel.com/en-us/node/459658
на винде больше 64 не ставится. может больше на каких-нибудь никсах можно будет выставить,
но и там наверняка есть предел.

если очень очень нужно 100 потоков, то - самодельное решение какое-нибудь. без OpenMP
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,117
Записей в блоге: 10
Завершенные тесты: 1
06.03.2014, 00:37 20
Цитата Сообщение от RayPas Посмотреть сообщение
castaway, 64
Цитата Сообщение от DU Посмотреть сообщение
на винде больше 64 не ставится.
У меня MinGW 4.8.2, выдаёт 100..
RayPas, увы, в Visual C++ не работаю, посоветовать пока ничего не могу. Видимо.., там свои ограничения..
0
06.03.2014, 00:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2014, 00:37

Создание потоков в Borland c
Есть ли возможность создание как минимум двух потоков процессора в borland c в...

OpenMP, создание потоков
В инете нашел много примеров по распараллеливание циклов, но никак не могу...

Создание потоков в рекурсивной функции
Почему при создании потоков в рекурсивных функциях скорость падает ? ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru