ну во-первых не threat, а thread.
во-вторых, использование или не использование потоков это очень контексто-зависимый параметр. Где-то можно и обойтись, а где-то нет. Опять же там где можно обойтись не всегда стоит обходиться. Вообщем вопрос ни о чем, ибо слишком абстрактен
Вообще вопрос ни о чем, ибо слишком абстрактен
Вот как раз эту абстракцию я и хочу развязать написав свой компилятор
Ошибки… Я пьян. гик =) threat — thread… игра слов.
Я бы даже сказал не лишённая смысла.
Завтра допишу что смогу…
А пока сильно не пинайте.
Я просто хочу узнать ваше мнение.
Правильно ли я рассуждаю о недостатках паралельного програмирования.
Я буду писать пьяным на хабр!!!
Да компилятор который сам будет вычислять наиболее подходящее кол-во потоков,
наиболее подходящие реализации функций, учитывающий аппаратное особенности каждого ядра,
как и для видеокарты, так и для процессора, так и для совсем постороннего компьютера.
В котором будет реализовано большое количество hardхаков и будет система
дамамайнинга для выборки наиболее подходящих.
Всё это будет реализовано в виде нейронной системы для которой можно разработать
системы генетического счисления для само-оптимизации. =)
На самом деле в некоторых ситуациях 16 потоков на 4х процессорах могут выполнить задачу быстрее, чем 4 потока на 4х процессорах. Если эта задача в каких-то местах не нагружает собственно сам процессор, а использует различные DMA или обращения к другим устройствам напрямую.
Попытка написать компилятор для решения этой задачи это попытка создать универсальное решение, которое не существует. Разве что вы сможете найти хороший генетический алгоритм. Но наиболее близким решением я здесь вижу создание компилятора, который будет строить различные гипотезы (переводить отдельные части исходного текста в различные машинные последовательности) и затем проверять их (запускать данные машинные последовательности, находя наиболее оптимальные по заданному числу параметров). В таком виде компилятор может давать существенно более эффективный код при правильном подходе. Но компилировать он будет очень долго))).
Да да… я именно и хочу использовать ДатаМайнинг, Генетику и муравьёв… =)
Для определения оптимального количества потоков и схемы распределения динамической памяти.
Просто я в этом напишу только сегодня вечером.
Вы о производительности всех алгоритмов так судите обычно — на выпуклый военно-морской глаз и записи в блокноте, или все же иногда пользуетесь профилировщиками и другими тулами, типа Intel Parallel Studio?
Не пишите на Хабр будучи пьяным. Я — тот-самый дед-кодер, со знанием ассемблера и грязных хаков по оптимизации код, от лица все нас, благословляю вас всех на облачную структуру.
Как вспомню этот ужас — содрогнусь, сколько времени было потрачено, чтоб софт более-менее нормально работал.
Не знаю, проработав с многопоточкой год, а уже на автомате проставляю блокировки и вижу эффективные стратегии использования ресурсов с минимальным количеством блокировок. Насколько они эффектвные — не знаю, но вроде никто не жалуется.
Потоки то нужны не только для распараллеливания одной задачи, но и для параллельного выполнения разных.
Разработчики Nvidia говорят на английском языке, поэтому «сменой режимов ядра CUDA» они это назвать не могли. По вашему же переводу совершенно не понятно что имеется в виду. Смена ядер CUDA? Инициализация CUDA? Переключение графического контекста между процессами?
По крайней мере на счет смены ядер, мой опыт показывает, что он занимает порядка 10 миллионых долей секунды, что по-моему весьма не плохо.
«сменой режимов ядра CUDA»
Перевёл это так я…
Разрабы, а пилял я их долго, очень морозились по этому поводу.
Смена режима ядра — это когда кусок кода с дерективой __kernel не может быть обработан на GPU и
переносится из памяти кода в оператву для выполнения процессором.
Копия этого кода может быть сохранена для подальшего использования, либо стёрта если в ней нет больше необходимости…
А в реальности такая копия создаётся при входе в экземпляр функции ядра
если её там ещё нет, и удаляется при выходе из всех экземпляров функций по обнулению счётчика их количества.
Если вам это ничего не сказало берите Id'у PRO и пилите Photoshop CS4.
Ещё перед установкой фотошопа нада поставить Cud'у.
Reversing ещё никто не отменял.
Увидите там много чего интересного и «тупого».
Эмс, дата-параллельное железо подходит только для одноимённых задач. Я больше по ATI карточкам — но в что нужно некоторые функции выполнять на проце верится слабо. Разве что если очень маленькие массивы с параметрами — тогда это имеет смысл. И поверьте от этого только плюс производительности системы. «Оптимальное количество потоков» на этапе компиляции — бред, про ThreadPool слышали? Он позволяет абстрагироваться от количества ядер и использует всегда столько потоков сколько ядер в системе. Узнать количество ядер в системе пользователя на этапе компиляции — невозможно ))) Почитайте в нете про латентный параллелизм.
«Оооо может лучше я объявлю несколько потоков для обработки этого цикла, а может быть он исполниться когда-то на 64 ядерной машине» — потоки должны создаваться динамически и только. Исключение — программирование приставок, спец. контроллеров.
Плюс конкурентная работа процессов по принципам erlang SIP тоже очень классная концепция. Асинхронно выполняются легковесные процессы которые могут обмениваться сообщениями без блокировки. Реализованно в Erlang, Haskell плюс можно сделать руками.
ThreadPool, ThreadPool'ом
Но вот оптимальное количество потоков очень абстрактное понятие
так как оно влияет на загрузку памяти, простой, задержки и т.д.
Я хочу разбирать его не на высоком уровне аля ITB, а почти-что самом ассемблере.
С учётом архитектуры и генетической оптимизации+датамайнинга.
Надо бы побыстрее написать вторую часть.
Но в что нужно некоторые функции выполнять на проце верится слабо…
Я инверсил фотошоп СS4 с использованием CUDA может когда-то и опубликую здесь результаты.
Но из 30-40 ассемблерных комманд GPU стека пропрыгивают 5-6 CPU'шных, например целочисельных
формирующие определённые функции.
Верится-не верится дело ваше — Ida в помощь.
Если хотите проверить мои слова, просто дизассемблируйте пару фильтров Фотошопа.
«Люди забыли что у шейдерного конвейера ограниченная точность и набор комманд.
Вот ему и приходится иногда сбрасывать часть кода на выполнение в процессор.»
у любого конвейера ограниченная длина, набор команд у декодера и он ограничен у любого устройства иначе это был бы философский камень, а не процессор.
Вот и я о том же…
Что всему нужно выполнять свой код, оптимизированный для выполнения на данной архитектуре.
Собственно в этом и суть будешей разработки.
Проблемы разработки реально быстрого ПО в наше время