Привет всем.
Скажите пожалуйста есть ли способ в .net обеспечить параллельное вычисление, именно параллельное, не асинхронное или многопоточное, именно параллельное, которое на нескольких ядрах и юзает процессор на полную без использования TPL и parallel linq?
Если да то подскажите как?
Если нет то, правда ли что в принципе это не нужно и если я создам в винде несколько потоков, то в принципе винда сама их распределить по ядрам? Т.е. получается мне нужно только синхронизировать эти потоки?
Здравствуйте, -n1l-, Вы писали:
N>Если нет то, правда ли что в принципе это не нужно и если я создам в винде несколько потоков, то в принципе винда сама их распределить по ядрам?
Распределит. По потоку на свободное ядро. И если ядер окажется меньше, то какие-то потоки будут ждать своей очереди.
Здравствуйте, Mihas, Вы писали:
M>Здравствуйте, -n1l-, Вы писали:
N>>Если нет то, правда ли что в принципе это не нужно и если я создам в винде несколько потоков, то в принципе винда сама их распределить по ядрам? M>Распределит. По потоку на свободное ядро. И если ядер окажется меньше, то какие-то потоки будут ждать своей очереди.
Т.е. это относится к функциям OS? В ручную это делать возможно?(Проф. интерес)
Здравствуйте, -n1l-, Вы писали:
N>Т.е. это относится к функциям OS? В ручную это делать возможно?(Проф. интерес)
В целом Windows дает мало возможностей для ручного управления threads (в целом это и не требуется).
Для x64 есть UMS (available for 64-bit applications running on 64-bit versions of Windows 7 and Windows Server 2008 R2 or later 64-bit versions of Windows).
Есть также парочка функций SetThreadAffinityMask() и SetThreadIdealProcessor() которые теоретически могут помочь вам, но скорее всего вы навредите системе используя их.
Здравствуйте, -n1l-, Вы писали:
N>Здравствуйте, a_g_99, Вы писали:
__>>SetThreadAffinityMask() и SetThreadIdealProcessor()
N>Да вот я как раз в гугле только на них и натыкаюсь. N>Ну что-ж, спасибо.
Суть грустной басни такова, что попытки регулировать планирование потоков на ядра могут привести к результату лучшему, чем системный шедулер. Но этот выигрыш с 99% вероятностью будет существовать лишь для текущей ситуации. Доустановка ещё какого-то софта (если там есть фоновые активности, желающие кусочек проца), переход на другую модель процессора (особенно если Intel <-> AMD), да даже очередной Windows Update перевернёт всё с ног на голову.
Т.е. стандартный шедулер пусть не идеален, но статистически хорош на широком спектре ситуаций. Можете написать лучший? Тогда cv@hr.microsoft.com или куда там у них принято резюме слать
Здравствуйте, -n1l-, Вы писали:
N>Привет всем. N>Скажите пожалуйста есть ли способ в .net обеспечить параллельное вычисление, именно параллельное, не асинхронное или многопоточное, именно параллельное, которое на нескольких ядрах и юзает процессор на полную без использования TPL и parallel linq? Если да то подскажите как? Если нет то, правда ли что в принципе это не нужно и если я создам в винде несколько потоков, то в принципе винда сама их распределить по ядрам? Т.е. получается мне нужно только синхронизировать эти потоки?
Если тебя интересует "параллельное" в смысле "распределенное по кластеру из нескольких машин", то это один вопрос.
Если тебя интересует "параллельное" в смысле "на нескольких ядрах одной машины", то многопоточная = параллельное. И потоки (Thread) .NET, а также TPL, как раз предназначены для этого.
И перестаньте уже писать велосипеды к тому, что и так хорошо и эффективно работает.
Здравствуйте, -n1l-, Вы писали:
N>Скажите пожалуйста есть ли способ в .net обеспечить параллельное вычисление, именно параллельное, не асинхронное или многопоточное, именно параллельное, которое на нескольких ядрах и юзает процессор на полную
"именно параллельное, которое на нескольких ядрах и юзает процессор на полную" называется "многопоточное".
N>в принципе это не нужно и если я создам в винде несколько потоков, то в принципе винда сама их распределить по ядрам?
Именно так.
Только вот создавать потоки не советую — в .NET уже есть CLR thread pool, который обычно прекрасно работает.
N>Т.е. получается мне нужно только синхронизировать эти потоки?
Не обязательно, есть несколько подходов, при которых вам их даже не нужно синхронизовывать, они сами.
Например TPL и parallel linq.