alexPec 3 14 сентября, 2022 Опубликовано 14 сентября, 2022 · Жалоба Всем доброго дня! Есть у меня задачка, но не нравится мне решение, которое я придумал. Задача - полученное значение распределить по 3м осям пропорционально дробной части каждой из координат. Вычисленное значение должно накапливаться в узлах координатной сетки. В итоге все сводится к тому, что надо прочитать, добавить к прочитанному значению вычисленное число и записать обратно в память 8 значений. Если предполагать, что порядок расположения элементов в памяти - по X, Y, Z, то надо вытащить (а потом записать) элементы из памяти со следующими индексами: X X+1 4*Y+X 4*Y+X+1 4*4*Z+4*Y+X 4*4*Z+4*Y+X+1 Все это надо сделать за такт, можно с использованием конвейера. Элементов всего 4*4*8 шт., каждый элемент 16 бит. Итого для хранения всего этого добра необходимо 4*4*8*16 = 2кбит. В идеале здесь бы пригодилась восьмипортовая память, но таковой нет, есть только двухпортовая. И на ultrascale+, где все реализовывается, она минимум 18кбит. Решение которое мне пришло в голову, это поставить 4 двухпортовых памяти, дублировать в них значения при записи. Параллельно вытаскивать 8 значений, делать сумму и записывать. Но тут я потрачу уже 18к*4 = 72кбит вместо 2х. Можно конечно на регистрах, но логики многовато сожрет. Как вариант можно было бы сделать 8*16 = 128 бит память, но данные там со смещением меньше 8 не вытащишь, только слова целиком. Может у кого идея будет как лучше сделать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 14 сентября, 2022 Опубликовано 14 сентября, 2022 · Жалоба эмм, не совсем понял задачу, но если у вам нужно одновременно писать и читать по 8 чисел в разнобой, то как вам поможет двухпортовка? точнее, как вы планируете дублировать запись за такт? Если вы пишете по одному числу, а читать надо 8 для вычислений, то что мешает на распределенной памяти собрать нужную вам конфигурацию? в слайсе там можно поставить память в режим 1 порт записи 4 порта чтения на 16 вхождений ну и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexPec 3 14 сентября, 2022 Опубликовано 14 сентября, 2022 · Жалоба 6 часов назад, des00 сказал: если у вам нужно одновременно писать и читать по 8 чисел в разнобой, то как вам поможет двухпортовка? точнее, как вы планируете дублировать запись за такт? нужно по 8ми адресам прочитать 16-битные числа (8 16ти битных чисел из всего 128 чисел), добавить к каждому произвольное число и записать обратно по тем же адресам. Кстати, да, Вы правы. дублировать то не получится разные адреса во все памяти сразу. Двухпортовка (точнее, 8-ми портовка) решила бы проблему. Записываем через порт записи, и на всех портах чтения данные доступны. Но и тут засада. Если за один такт и конвейером, то получается надо одновременно читать по одним адресам 8 чисел и в этом же такте записывать по другим 8 других чисел. Цитата в слайсе там можно поставить память в режим 1 порт записи 4 порта чтения на 16 вхождений ну и т.д. Ни разу этим не пользовался, посмотрю, спасибо. Это у ксайлинкса? Но похоже все-таки на логике придется делать. Но тогда ведь наверно синтезатор мультиплексоров понаставит, если мне нужно индексировать (выбирать)по сути произвольно 8 из 128 чисел. Скорость просядет... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 14 сентября, 2022 Опубликовано 14 сентября, 2022 · Жалоба 1 hour ago, alexPec said: нужно по 8ми адресам прочитать 16-битные числа (8 16ти битных чисел из всего 128 чисел), добавить к каждому произвольное число и записать обратно по тем же адресам. Кстати, да, Вы правы. дублировать то не получится разные адреса во все памяти сразу. Двухпортовка (точнее, 8-ми портовка) решила бы проблему. Записываем через порт записи, и на всех портах чтения данные доступны. Но и тут засада. Если за один такт и конвейером, то получается надо одновременно читать по одним адресам 8 чисел и в этом же такте записывать по другим 8 других чисел. Да, как раз в этом и проблема) 1 hour ago, alexPec said: Ни разу этим не пользовался, посмотрю, спасибо. Это у ксайлинкса? Да, в SLICEM есть хитрые включения LUT в режиме памяти, там можно делать разные конфигурации 1 hour ago, alexPec said: Но похоже все-таки на логике придется делать. Но тогда ведь наверно синтезатор мультиплексоров понаставит, если мне нужно индексировать (выбирать)по сути произвольно 8 из 128 чисел. Скорость просядет... реализация на регистрах тут прослеживается явно. 8 чисел сложно, тем более нужно учитывать что даже двухпортовка, с точки зрения доступа к адресу при пакетной обработке, это либо чтение, либо запись. Если у вас пакет и вы его читаете, то у вас возникнет коллизия адресов головы и хвоста. Поэтому тут стоит рассматривать один адрес записи и один адрес чтения. Не знаю точно вашей организации вычислений, но если X/Y/Z это числа то у вас есть как минимум четные и нечетные адреса, разбиваем память на два блока, ставим крос-мультиплексор по адресу и данным и пишем данные по четному/нечетному адресу в разные блочки памяти, но одновременно. Чтение аналогично. Подобное я делал в турбодекодерах, когда надо гулять по решетке. Можно масштабировать систему на 4/8, но из ваших формул адреса четко не видно что там все адреса будут попадать в разные блочки памяти (например, при Y = 0, адреса X+1/4*Y+X+1 совпадут) Опять же зависит от вашей тактовой частоты, может быть задрать тактовую частоту? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexPec 3 14 сентября, 2022 Опубликовано 14 сентября, 2022 · Жалоба Так, попробую более обще описать задачу. Есть 128 ячеек памяти, по 16 бит элемент. Каждый такт на вход подается 8 чисел и 8 адресов (для каждого числа). Адрес означает позицию в массиве 128ми ячеек. Надо к числам по этим адресам добавить соответствующие входные числа. Т.е. такой "интегратор", 8 чисел добавляются за такт к числам по указанным адресам. А частота итак уже на грани, у меня остальная часть проекта работает на 200МГц. Вряд ли тут задерешь... Слэки минимальные тайминг анализер показывает 0,6нс. Ну и допущение - на входе два одинаковых адреса не появляется Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 33 14 сентября, 2022 Опубликовано 14 сентября, 2022 · Жалоба 1 hour ago, alexPec said: Ну и допущение - на входе два одинаковых адреса не появляется в любом случае по вашему алгоритму нужно за такт 8 чтений и 8 записей по произвольным адресам из одного массива. А это проще всего можно сделать только на регистрах. Причем проблема именно во множественной записи. В инете видел статьи о схемах создания мулти-портовой памяти, причем как на чтение так и на запись, поищите может что и подойдет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slkhome 0 14 сентября, 2022 Опубликовано 14 сентября, 2022 · Жалоба 11 hours ago, alexPec said: В идеале здесь бы пригодилась восьмипортовая память, но таковой нет, есть только двухпортовая. И на ultrascale+, где все реализовывается, она минимум 18кбит. Был опыт реализации 4х портовой памяти, на 2х портовых ячейках блочной памяти. По идее по такому же принципу ее можно еще раз масштабировать и сделать из 4х - 8ми портовую. Только при этом возрастет количество задействованной памяти в 4 раза. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 33 14 сентября, 2022 Опубликовано 14 сентября, 2022 · Жалоба 8 minutes ago, slkhome said: Только при этом возрастет количество задействованной памяти в 4 раза. и не только, еще и падает макс. частота Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexPec 3 14 сентября, 2022 Опубликовано 14 сентября, 2022 · Жалоба Всем спасибо за советы! Видимо да, направление мысли в сторону регистров самое верное в этой задаче. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 15 сентября, 2022 Опубликовано 15 сентября, 2022 · Жалоба 10 hours ago, slkhome said: Был опыт реализации 4х портовой памяти, на 2х портовых ячейках блочной памяти. а как вы реализовывали когерентность записи от каждого из портов и разруливали приоритет read-first, write-first? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slkhome 0 15 сентября, 2022 Опубликовано 15 сентября, 2022 · Жалоба 4 hours ago, des00 said: а как вы реализовывали когерентность записи от каждого из портов и разруливали приоритет read-first, write-first? Честно говоря - уже не помню тонкостей. Это использовал для реализации вейвлет-преобразования. Нужно было быстро реализовать - поэтому было уже не до оптимизации. Место в кристалле было. Алгоритм работал. Если есть желание поразбираться - могу поискать исходники Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 15 сентября, 2022 Опубликовано 15 сентября, 2022 · Жалоба 4 minutes ago, slkhome said: Честно говоря - уже не помню тонкостей. Это использовал для реализации вейвлет-преобразования. Нужно было быстро реализовать - поэтому было уже не до оптимизации. Место в кристалле было. Алгоритм работал. Если есть желание поразбираться - могу поискать исходники Если вам не сложно, буду признателен. Т.к. не понимаю как можно в двух портовую память, на основе которой сделали 4-х портовку, записать 4 числа по произвольным адресам за 1 такт) Такое можно сделать с разделением адресов, когда есть четкая предопределенность адреса (например всегда пишется четный и нечетный адрес, нет двух нечетных или четных). Поэтому мне и стало интересно) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slkhome 0 15 сентября, 2022 Опубликовано 15 сентября, 2022 · Жалоба qpram_pass_qawsed.7z 38 minutes ago, des00 said: Если вам не сложно, буду признателен. Если не сложно, то напишите что выясните по этим исходникам, плиз Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 15 сентября, 2022 Опубликовано 15 сентября, 2022 · Жалоба 28 minutes ago, slkhome said: Если не сложно, то напишите что выясните по этим исходникам, плиз без проблем, а пароль к архиву можно в личку? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 15 сентября, 2022 Опубликовано 15 сентября, 2022 · Жалоба В 15.09.2022 в 11:52, des00 сказал: без проблем, а пароль к архиву можно в личку? :) КО говорит, что он в названии архива:))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться