sami
Местный
О каких задачах собственно речь? Причем тут динамически создаваемые объекты? Какие проблемы с их распараллеливанием?Абсолютно согласен. Динамически создаваемые объекты с трудом параллелятся (а таких задач уйма).
О каких задачах собственно речь? Причем тут динамически создаваемые объекты? Какие проблемы с их распараллеливанием?Абсолютно согласен. Динамически создаваемые объекты с трудом параллелятся (а таких задач уйма).
Например, те же разреженные матрицы. Допустим, при умножении формирование конечной матрицы происходит динамически. Следовательно, размер конечной матрицы (объекта, который формируется, например, массивом списков) не известен. Поэтому, попытки распараллеливания не дают результатов, так как каждой нити(thread) требуются сведения о текущем индексе в конечной матрице. Что требует постоянной синхронизации и дополнительного времени.О каких задачах собственно речь? Причем тут динамически создаваемые объекты? Какие проблемы с их распараллеливанием?
Ну это как распараллеливать. Каждый thread может умножать строку первой матрицы на вторую матрицу для получения разреженной строки. Потом формировать разреженноую матрицу из отдельных строк результата. Никакой синхронизации. Плохой пример.Например, те же разреженные матрицы. Допустим, при умножении формирование конечной матрицы происходит динамически. Следовательно, размер конечной матрицы (объекта, который формируется, например, массивом списков) не известен. Поэтому, попытки распараллеливания не дают результатов, так как каждой нити(thread) требуются сведения о текущем индексе в конечной матрице. Что требует постоянной синхронизации и дополнительного времени.
Решение проблемы заданием конечного размера результирующей матрицы приводят нас к задаче со статически создаваемыми матрицами, так как размер мы можем ограничить сверху лишь размером матрицы, представленной в стандартном виде (массив).
Прежде чем давать оценку моему примеру, следовало бы повнимательнее читать. Массив списков для компактного хранения содержит индексы не нулевого элемента и сам элемент. При этом, нужно бегать по всему списку и искать соответсвующие индексы, при этом запоминая(!) их, чтобы потом использовать для другой матрицы (где и происходит динамическое формирование результирующей матрицы), что одновременно без синхронизации всех нитей приведёт к ложному результату, о чём я писал выше. В вашем же случае приходиться перебирать заведомо нулевые элементы, что не сохраняет принцип работы с исходными матрицами. Ваш контрпример годится лишь для умножения обычных статических матриц, где умножение происходит по классическому алгоритму[O(n3)].Ну это как распараллеливать. Каждый thread может умножать строку первой матрицы на вторую матрицу для получения разреженной строки. Потом формировать разреженноую матрицу из отдельных строк результата. Никакой синхронизации. Плохой пример.
Ща попробуюПрежде чем давать оценку моему примеру, следовало бы повнимательнее читать.
Массив списков по своей природе может содержать только списки и больше ничего. Догадываюсь, что речь о том, что массив списков содержит списки, список содержит структуры, где в каждой структуре индекс колонки элемента, отличного от нуля, и значение элемента соответственно.Массив списков для компактного хранения содержит индексы не нулевого элемента и сам элемент.
ну зачем же их запоминать, если они запомнены в списке?При этом, нужно бегать по всему списку и искать соответсвующие индексы, при этом запоминая(!) их
Зачем результирующей матрице индексы исходной матрицы?чтобы потом использовать для другой матрицы (где и происходит динамическое формирование результирующей матрицы)
При таком подходе - не сомневаюсь в этом.что одновременно без синхронизации всех нитей приведёт к ложному результату, о чём я писал выше.
Откуда ж возьмутся заведомо нулевые, если в разреженной матрице они не хранятся? Последнее Ваше утверждение, пожалуй, опровергну:В вашем же случае приходиться перебирать заведомо нулевые элементы, что не сохраняет принцип работы с исходными матрицами. Ваш контрпример годится лишь для умножения обычных статических матриц, где умножение происходит по классическому алгоритму[O(n3)] .
P.S. Признаю, что существуют алгоритмы мало поддающиеся распараллеливанию, но они не характерны для вычислительных задач среднего потребителя, как то фотошоп, игры, работа с медиаконтентом и даже рендеринг 3D сцен. Даже задачи WEB серверов достаточно хорошо мастшабируются. А если не мастшабируются, то выручает виртуализация.
Системы инженерных расчетов я не отношу к используемым большинством. И тут проблема скорее в существующем софте, нежели в плохой масштабируемости алгоритмов.
В итоге, в нашем случае полосы пропускания связки контроллер - память едва ли хватит чтоб загрузить одно ядро.
Не всегда задача активно работает с внешней памятью, поэтому можно принять что сдвоенный контроллер памяти "продует" 2 - 4 ядра, но вот 8 ядер и более потребуют серьезной модификации платформы, иначе эффективно проявить себя вряд ли смогут.
Тут уже другое... Конечно, если элементы списка (я про представление разреженной матрицы еще) будут раскиданы по всей оперативке да еще и в свапе, то толку от многоядерности будет мало. Однако, если матрицы представить массивом массивов ненулевых элементов с индексами (усложнит модификацию такой матрицы), либо предусмотреть аллокатор для элементов списков, который будет заботиться о выделении памяти под элменты "рядом", то продувка будет огого!Дело не в реализации алгоритмов и соответственно ПО. Да, свертка матриц паралелится на ура. Все же рассмотрим такую утрированную гипотетическую ситуацию когда исходные данные (возъмем тип данных Dfloat - 64 бит) не "сидят" в кэше, а находится во внешней памяти (размер превышает объем кэш памяти, данные после DMA переноса или в результате предыдущих операций)....
Я с ним не согласен.Дональд Кнут написал(а):О проблемах перехода обычного ПО на многоядерную архтектуру современных процессоров.
"Для меня это выглядит более или менее так: разработчики техники исчерпали идеи, и они дают разработчикам ПО компьютеры, которые работают быстрее всего на нескольких из ключевых тестов. Таким образом производители компьютеров пытаются переложить вину за будущую кончину закона Мура на программистов!"
"Я совершенно не буду удивлен, если вся идея мультитрединга обернется большей неудачей, чем направление "Itanium". Это направление предполагалось таким прекрасным - пока не выяснилось, что желанные компиляторы было попросту невозможно написать."
"Позвольте мне сказать так: в течение последних 50-ти лет, я написал более 1000 программ, многие из которых имели приличный размер. Я не думаю что даже 5 из них можно существенно улучшить, применив параллелизм или мультитрединг."
"Так почему я должен быть так доволен будущим, которое обещают производители компьютеров? Они думают, что "волшебная пуля" прилетит и сделает так, чтобы при помощи мультиядерности ускорились приложения, которые я использую?
Я думаю, что это несбыточная мечта (англ. pipe dream). Нет! Это неправильная метафора! "Pipeline"-ы действительно работают, а вот треды - нет. Возможно мне следовало использовать слово "пузырь"
Вы в этом так уверены? Массив книг может содержать только книги, страницы он ну никак не может содержать.Массив списков по своей природе может содержать только списки и больше ничего.
Гениальная догадка.Догадываюсь, что речь о том, что массив списков содержит списки.
Масло содержит масло - нельзя не согласиться.Список содержит структуры...
cij =∑aik*bkjну зачем же их запоминать, если они запомнены в списке?
Зачем результирующей матрице индексы исходной матрицы?
А вот тут. Мой алгоритм удароустойчив, так как не требует отсортированности и позволяет в любой момент изменить матрицу, путём добавления нового элемента в массив (ок, не в массив, а в связную структуру, которая содержится в массиве), при этом по сути не требуется знать размер исходных матриц. И тут возникают трудности с распараллеливанием.А что такое динамически создаваемые объекты - я так и не понял
Здесь или прямой перебор(что требует знать полный размер и бегать по заведомо нулевым элементам) или запоминание. Понимаю, что на уровне форума лениво полностью писать весь алгоритм, поэтому вопросов "ну зачем?" и "зачем?" избегу.Для перебора столбцов второй матрицы можно использовать сканирующую линию, но в ней двигать только те элементы, чьи индексы присутствуют в текущей строке умножаемой матрицы...
Как раз в задачах среднего потребителя не вижу большого прока от наращивания колличества ядер, о чём писал ещё в первом своём посте данного топика.
Это верно для компьютерной модели.Массив книг может содержать только книги, страницы он ну никак не может содержать.
Извиняюсь, фишку не просек. Прикинул только на пальцах, что алгоритмическая сложность такого решения должна быть выше сложности стандартного алгоритма.Умножение происходит по равным (k) колоночным и строчным индексам соответственно элементов aik и bkj. Будем выбирать такие элементы, при этом запоминая индекс, который “помнит” строчные(i) и колоночные индексы(j). При этом он будет сохраняться в исходном состоянии, если (i) и (j) при следующих проходах цикла ему уже встречались. Индекс представлен на основе односвязного списка. Проход идёт по двойному циклу и через условие по не полному тройному... Но не об этом спор.
Ок, удароустойчив, но предсортировка и костыли по ее поддержке (взведение флага при внесении нового элемента) могли бы здорово увеличить производительность на многоядерной системе. Знать размер исходных матриц не требуется, но он достается бесплатно из входных данных (размеры массивов на входе известны)А вот тут. Мой алгоритм удароустойчив, так как не требует отсортированности и позволяет в любой момент изменить матрицу, путём добавления нового элемента в массив (ок, не в массив, а в связную структуру, которая содержится в массиве<_<), при этом по сути не требуется знать размер исходных матриц. И тут возникают трудности с распараллеливанием.
(В таких случаях свободные ядра могут заниматься другими вычислениями иногда даже в рамках той же задачи) Конечно, нельзя в любом случае создать отлично распараллеливающийся алгоритм. И даже более того, не всегда стоит бросаться распараллеливать все, что хорошо распараллеливается. Тут зависит от мотивации.Я не сомневаюсь, что вы способны расспараллелить параллелищейся алгоритм. Не в этом дело.
Всегда ли его можно создать? Имеются оптимизированные для одного ядра алгоритмы, для которых приходится решать отдельную задачу (не теряя его временной сложности и размера), которая может оказаться на порядки сложнее, чем сама его разработка.
Прок для потребителя очень легко измеряется в рублях. Нет смысла покупать двухъядерный процессор чтобы выкинуть одноядерный. Но при покупке нового компьютера при прочих равных условиях потребитель предпочтет двухъядерный процессор, хотя бы потому, что в приложениях, оптимизированных под многоядерность, он будет заметно шустрее, а в неоптимизированных приложениях отставать от одноядерного не будет.Как раз в задачах среднего потребителя не вижу большого прока от наращивания колличества ядер, о чём писал ещё в первом своём посте данного топика.