Добрый день, Уважаемые Господа!
Перед мной стоит задача задействовать ресурсы графического процессора для проведения параллельных вычислений.
Решается задача, требующая очень большого количества массивных вычислений.
На данный момент существует программа, которая позволяет:
- распараллеливать проведение расчетов на ПРОИЗВОЛЬНОЕ количество процессов
- запускать эти процессы на разных ядрах CPU с целью увеличения производительности вычислений
- запускать эти процессы на удаленных машинах используя MPI-механизм с автоматической балансировкой нагрузки в зависимости от организации сети (гетерогенная или гомогенная), в зависимости от загруженности сети, трафика и т.п.
ОПЫТНЫМ СПОСОБОМ проверено, что узким местом являеются именно вычислительные ресурсы.
Внутрисетевые траффик-трэкеры показывают, что сетка загружена только на треть ее пропускной способности, при том, что процы на машинах загружены под завязку.
Примерно та же самая ситуация с нагрузкой на системную шину при использовании многоядерной машины при 100% загруженности процов.
Очевидно, что использование современных многопоточных GPU может позволить получить выигрыш в скорости вычислений по сравнению даже с многоядерными CPU и сетевыми вычислениями.
Для решения этой задачи, по всей видимости, мне нужно будет создание программы-конвертера, которая
- работала бы в фоновом режиме, во время работы расчетной программы
- позволяла бы осуществлять перехватывание команд между расчетной программой и CPU
- перенаправляла бы вычисления из CPU в GPU.
ПОЭТОМУ, МНЕ ХОТЕЛОСЬ БЫ УЗНАТЬ ВАШЕ МНЕНИЕ ПО ПОВОДУ СПОСОБОВ РЕШЕНИЯ ЭТОЙ ЗАДАЧИ!!!
Сложность заключается в том, что все это нужно мне сделать БЕЗ МОДИФИКАЦИИ ИСХОДНОГО ТЕКСТА ПРОГРАММЫ из-за дого, что ее разработчика уже нет (уехал) и найти его НЕ ВОЗМОЖНО.
Исходный текст программы пропал вместе со сгоревшим HDD, на котором велась разработка.
Мне поставили задачу реанимировать проект.
В программе происходит расчет кинентики химических реакций многокомпонентных смесей.
Тематика велась на протяжении нескольких ДЕСЯТКОВ лет с советских времен и написать сейчас с нуля то же самое просто невозможно.
В наследство мне досталось некоторое подобие кластрера из нескольких машин, где денно и ночно крутятся вычислительные задачи.
С каждым годом, химический состав рассчитываемых смесей усложняется.
Это ведет за собой рост вычислительных затрат в 100, 1000 и более раз.
Поэтому экстенсивный рост производительности путем наращивания количества компов в кластере настолько увеличивает накладные расходы на выполнение работ по расчетам, что они становятся не выгодными.
Мне кажется, что наиболее эффективным способом решения этой проблемы является задействование ресурсов GPU с помощью использования ШЕЙДЕРОВ на языке их описания OpenGL Shading Language (GLSL).
Таким образом, скажем для видеокарты NVIDIA GeForce 8800 вычисления можно разделить на 128 обособленных, совершенно самостоятельных потоковых процессоров с тактовой частотой до 1,35 ГГц.
В синтаксисе GLSL существуют возможность выполнять в GPU такие же никоуровневые команды как и в ассемблере для CPU (ADD, SUB и т.д.).
Значит, нужно в «прозрачном» режиме для каждого из запущенных процессов просто перенаправлять на исполнение команды из CPU в GPU.
Таким образом, необходимо решить 2 следующие задачи:
1. Найти способ перехватывания инструкций между расчетной программой и CPU для каждого из запущенных процессов.
2. Найти способ перенаправлять вычисления из CPU в GPU и в обратную сторону.
Прошу высказать ваше мнение о том, какие способы можно использовать для решения описанной выше задачи, и подробно описать возможные методы решения.
Заранее благодарен всем за дельные советы, Triton.
|