kerby2000 писал(а):А вы бы не могли тут по подробней объяснить, почему распараллеливание по ядрам тут не поможет?
Я не утверждаю, что совсем не поможет. Просто подозреваю, что практически работающего решения не получить. Ну уменьшится время с 10 лет условно до 5 - какая разница?
kerby2000 писал(а):Вы считаете bottleneck'ом будет I/O, а не CPU ?
Понятия не имею. Я не знаю алгоритма экспорта.
Общая логика такова. Пусть задача выполняется за время t на одном узле. На N узлах та же задача выполняется за время T. Тогда ускорение будет равно t/(TN). Понятно, что в обычных случаях при идеально распараллеливаемом алгоритме с отсутствием побочных затрат на синхронизацию и межузловое взаимодействие невозможно достичь ускорения больше 1. Чтобы решить задачу быстрее в N раз, обычно надо увеличить число узлов никак не меньше чем в N раз. Пример практически идеально распараллеливаемом задачи для SAS - это скачивание тайлов (для идеалистов - с нескольких сетевых интерфейсов, на несколько хардов,...), в простейшем случае один "поток" качает с одной стороны списка тайлов, другой - с другой. Условие остановки работы алгоритма известно заранее и не меняется (впрочем, алгоритм легко модифицируется и для случая докачивания области ответственности одного "потока" другим "потоком"), специальная синхронизация не нужна (как если бы потоки качали тайлы с одной стороны примерно по очереди через одного и не лезли вдвоём за одним тайлом). В общем, полная аналогия с каменщиками, кладущими стену из кирпичей. Но увеличить скорость более чем вдвое так не получится.
Здесь написано "обычно" - потому что бывают случаи, когда ускорение реально бывает больше 1. Чтобы понять, когда это бывает, надо в деталях знать алгоритм. Реальный пример могу привести, как задачи матфизики считают. Есть много процессоров, у каждого свой сетевой интерфейс и свой диск для данных - по сути процессорный кэш. Если общий массив даных не может быть поделён на все процессоры (а судя по всему это Ваш случай, ибо я не поверю, что в ближайшее будущее будет создан "железячный" кэш на сотню гигов и соответствующие бытовые процы с соответствующми коммуникациями) - придётся использовать "дорогую" скачку по сети во время работы (аналогия с бытовым компом весьма очевидна). Однако начиная с некоторого числа процессоров взаимодействие по сети скачкообразно сводится к минимуму (обусловленному обработкой граничиных условий, передачей данных между узлами и т.п.) - данные полностью попали в кэш. Впрочем, при дальнейшем увеличении количества вычислительных узлов ускорение где-то опять начнёт падать. Просто потому что невозможно любой параллельный аглоритм бесконечно масштабировать. Даже если (добиваясь максимальной производительности) строить стену в один кирпич толщиной и высотой (этакая дорожка из кирпичей), и каждый каменщик возьмёт по кирпичу и приготовится его поставить на место по команде, добавление новых каменщиков никак не скажется на скорости работы, а ускорение очевидно уменьшится (вследствие увеличения числа каменщиков). Поэтому определение оптимального числа вычислительных узлов является составной частью реализации параллельного алгоритма.
kerby2000 писал(а):CUDA сообщает повышение обработки параллельных алгоритмов до 100 раз.
Ну, обещать-то можно многое. Например 2 - это тоже "до 100". Мой опыт в параллельным вычислениях говорит, что если серебряная пуля и существует, то явно не в этой области. Даже для казалось бы вдоль и поперёк изученных вычметодов решения уравнений матфизики не всегда известна (в смысле "доказана") оптимальная архитектура решения.