|
Хранение и работа с большими матрицами в ПЛИС, Размера 1000х500 |
|
|
|
Aug 6 2014, 18:39
|

я только учусь...
     
Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839

|
Цитата(count_enable @ Aug 6 2014, 21:04)  Есть большая матрица, размера эдак 1000х500 8-битных целых. Требуемые операции (в порядке приоритета по скорости): - Сумма выбранных элементов из столбца А, типа А1+А5+А100+А512. - Сумма выбранных элементов из строки B, типа B1+B5+B100+B512. - К выбранному элементу добавить или отнять 8-битное целое. - Заполнение матрицы начальными значениями.
Операций умножения нет. Решение в лоб это декларация двумерного массива и работа как с однопортовой ОЗУ с чтением-записью поэлементно. Но так как по грубым прикидкам операция суммирования в столбце или в строке будет занимать около 3/4 всех вычислений, хочется чего-то более умного. Целевое железо это Virtex 5.
Думаю над тем чтобы разбить столбцы (число строк всегда больше числа столбцов) на отдельные BRAM, тогда можно будет выбрать все элементы строки в один цикл, но обратная задача - все элементы столбца тогда опять получается O(N). Есть ли решения получше? Можно использовать внешнюю DDR, но вряд ли она здесь поможет. в целом алгоритм какой? есть ли какие-то зависимости по выбираемым слагаемым (номера столбцов/строк) и их количеству в сумме? как и когда производиться нахождение разности? по приведенным данным довольно сложно что либо по советовать...
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Aug 6 2014, 19:30
|
Местный
  
Группа: Свой
Сообщений: 310
Регистрация: 28-01-13
Из: Лондон
Пользователь №: 75 384

|
В матлабе уже давно всё работает, матлаб вообще превосходно заточен для матричных операций. Если точнее, то делаю алгоритм обучения Restricted Boltzmann Machine. Вкратце алгоритм таков: - Получаем на входе множество строк, которые надо выбрать из столбцов (А, В, Е, Х....) - Для каждого столбца считаем сумму элементов в строках (А, В, Е, Х....). Данная операция равноценна умножению бинарного вектора Х [0,1] на матрицу. Обычно вектор довольно разряженный, т.е. количество единиц меньше половины но никаких закономерностей нет. - Потом получаем множество столбцов и повторяем операцию, только суммируем элементы в строках. Данная операция равноценна умножению вектора на транспонированую матрицу. Допустим у нас есть вектор и матрица: Код [ 0, [ A B C 1, D E F 1, G H I 0] J K L ]
Тогда результатом будет вектор [ D+G , E+H, F+I ] Надеюсь, понятно обьяснил. Из этих двух операций и состоит 75% алгоритма. После чего следует поэлементное сложение чисел в матрице, т.е. к каждому элементу добавляется некое число, положительное или отрицательное.
|
|
|
|
|
Aug 6 2014, 22:22
|
Местный
  
Группа: Свой
Сообщений: 310
Регистрация: 28-01-13
Из: Лондон
Пользователь №: 75 384

|
RobFPGA, у меня XC5VLX110T, 64 DSP, 296 BRAM18. Насколько я понял, Вы предлагаете держать по сути две матрицы, прямую и транспонированую в блоках по 16 бит, где старший байт- прямая матрица, а младший-обратная? К сожалению, боюсь двойной размер я не потяну  . И я не понял зачем там DSP - есть только сложение, без умножения. Пока что мне нравится такой вариант: Один BRAM держит один или 2 столбца (матрица до 1125х592). Два набора сумматоров: один делает сумму выбранных столбцов для заданной строки (все строки пробегаем за O(К), т.к. у нас одно чтение с каждого столбца), второй делает сумму выбранных строк для всех столбцов (т.е. у нас по одному сумматору на BRAM) и мы последовательно читаем все выбранные строки, пробегая их за О(М). Тревогу пока вызывает первый сумматор: он должен суммировать за O(1) все столбцы, т.е. иметь ~500 входов, что меня немного пугает и подталкивает до сложения в цикле (10х50, например).
|
|
|
|
|
Aug 6 2014, 23:05
|
Профессионал
    
Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643

|
Приветствую! Ну с таким маленьким (чипом конечно же) будет большой секс Немного не понял - если у Вас в BRAM один - или 2 столбца - откуда появился 500 входной сумматор ??? Так как полная матрица внутрь не влезет то остается работать с внешней - а тут увы все упирается в полосу пропускания памяти. Хорошо если это какая-нибудь *SRAM куда хочу туда и читаю, если же DRAM - то выборка на чтение только по одному направлению матрицы. Если несколько входных битовых векторов маски суммирования известны заранее то можно за одно чтение полной матрицы из внешней памяти сразу получать соответствующее количество результатов суммирования. Я имел ввиду что 2 матрицы хранятся в разных половинах BRAM - старший бит адреса в порте A=0, а в B=1 поэтому как бы имеем 2 независимых блока 512х16 - но это уже не столь актуально. На DSP удобно не только умножать - но и просто суммировать - один DSP48 может работать как один сумматор 48+48 или как 2 24+24 или как 4 12+12 Успехов! Rob.
|
|
|
|
|
Aug 7 2014, 08:55
|
вопрошающий
    
Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436

|
Цитата(count_enable @ Aug 7 2014, 00:04)  Есть большая матрица, размера эдак 1000х500 8-битных целых. Требуемые операции (в порядке приоритета по скорости): ... Целевое железо это Virtex 5. Давайте прежде чем что-то в железе имплементировать, изучим чуток Ваш алгоритм. Во-первых, интересует диапазоны разреженности векторов и матрицы, целевые размеры матрицы, число итераций по сходимости РБМа. Во-вторых, не проще ли сделать разреженное сингулярное разложение или адаптивнцю кросс-аппроксимацию Вашей матрице и применить РБМ уже на такую факторизованную матрицу. Если озвученные размеры в 1Кх1К верны, то влоб лапаком даже без разреженности Вы это быстрее чем за 0.1с на обычном компьютере получите. В-третьих: что хочется, решить задачу, решить много задач, решать быстро и тратить мало электричества, решать еще быстрее, но наплевать на электричество, или все-тики есть "шашечки" в виде Витрекса?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|