new123 0 June 8, 2021 Posted June 8, 2021 (edited) · Report post 7 hours ago, novartis said: С помощью такой команды можно записать 32 байта за раз _mm256_storeu_si256 ради интереса, проверяли? Действительно так делает? я, к примеру, маплюсь на какой нить Bar из linux, записываю блок памяти на него, но он все равно потом блоками по 4 байта пишет. Можно вроде по 8, если Linux 64-битный, но тут уже проблема со стороны альтеровской корки пойдет, у меня не вышло по 8. Давно видел науйчную работу, что если нужно перекинуть до 64 байт по pcie, то быстрее будет по 4 байта так, чем DMA, а все что выше, только DMA 5 hours ago, AVR said: В таком случае, производительности будет более чем достаточно задачи, поток в ПЛИС менее 250 килобайт в секунду, не будет загрузки процессора более чем 1 процент, что приемлимо. я как то однажды epcq вывел на pcie через BAR )) И писал со стороны Linux по 4 байта. 32мб перегонял так ) Если слаков нет в проекте, то было это достаточно быстро. Но речь конечно не о секундах. Но когда все закешируется в проце на запись уходит по 50нс (тут еще зависит от того, чтобы проц не засыпал, выставить в Linux cpu perfomance и тд), проверено точно из самой плис, фиксировал там данные. Edited June 8, 2021 by new123 Quote Share this post Link to post Share on other sites More sharing options...
1891ВМ12Я 0 June 8, 2021 Posted June 8, 2021 · Report post 4 minutes ago, new123 said: Давно видел науйчную работу, что если нужно перекинуть до 64 байт по pcie, то быстрее будет по 4 байта так, чем DMA, а все что выше, только DMA Я сейчас делаю кое что на Nios+PCIE (так удобно было коллегам) и на Xilinx. Как сделать это на Xilinx без soft-cpu там понятно но не пробовал, там просто dma_sync_single_for_device и далее шлю адрес, устройство дает серию TLP на чтение с completion. Как это делать на Nios+PCIE совершенно непонятно. Но если скорость достаточная в теории, то даже если быстрее, есть еще критерий как проще и достаточно ли будет такого решения. Quote Share this post Link to post Share on other sites More sharing options...
new123 0 June 8, 2021 Posted June 8, 2021 (edited) · Report post 8 minutes ago, AVR said: Как это делать на Nios+PCIE совершенно непонятно. Но если скорость достаточная в теории, то даже если быстрее, есть еще критерий как проще и достаточно ли будет такого решения. Как на nios, увы. Я этого зверя никогда не делал. Так в принципе вам уже один совет дали. Мой подход был таков: 1) Делаю в pcie корке любой доступный BAR (BAR0 обычно занят DMA движком, можно брать BAR1-BAR2). Ставлю ему нужный сайз. 2) На pcie появляется разделы. 3) Ну а дальше в линуксе дело техники. Либо его в своем драйвере подключаем и юзаем iowrite32 4) Либо, делаем map на файл вида /sys/bus/pci/devices/0000:02:00.0/resource2 (нужный адрес подставить самому) И пишем прям в него. Ну или читаем. upd. 5) Забыл самое главное написать ). После активации BAR1-2 в корке, появляется порт вида BAR2... или как то так. Типа Avalon. И сажаем на него, что душе угодно. Можно on_chip_memory к примеру, можно что нибудь свое и тд. Оно и появится в линуксе Edited June 8, 2021 by new123 Quote Share this post Link to post Share on other sites More sharing options...
novartis 0 June 8, 2021 Posted June 8, 2021 · Report post 4 hours ago, new123 said: ради интереса, проверяли? Действительно так делает? да, это рабочий вариант 4 hours ago, new123 said: Давно видел науйчную работу, что если нужно перекинуть до 64 байт по pcie, то быстрее будет по 4 байта так, чем DMA, а все что выше, только DMA Логично) Чтобы хосту записать в плис по pcie 64 байта, нужно отправить 16 TLP пакетов по 4 байта данных, пусть время между TLP пакетами 50нс-100 нс, значит на пересылку 64 байт уйдет 800нс-1600 нс. При дма будет так: хост записывает команду на старт дма, плис посылает TLP пакет на чтение 64 байт, хост отвечает одним TLP пакетом с 64 байтами данных. Где-то 1100 нс выйдет. 4 hours ago, AVR said: Как это делать на Nios+PCIE совершенно непонятно. Я так понимаю Nios+PCIE собраны в QSYS, у модуля PCIE есть порт Txs (Avalon Memory Mapped Slave), если в этот порт послать транзакцию на чтение данных, указать адрес (который неким образом соответствует адресу, переданному с хоста), указать burst (длину читаемых данных), то получится dma. Но у вас к PCIE подключен Nios, не знаю вроде не умеет ниос посылать burst транзакции, он обычными IO операциями по 4 байта оперирует, так что надо ставить dma контроллер, можно свой написать, подключить его к Txs параллельно ниосу. Quote Share this post Link to post Share on other sites More sharing options...
new123 0 June 9, 2021 Posted June 9, 2021 · Report post 11 hours ago, novartis said: Чтобы хосту записать в плис по pcie 64 байта, нужно отправить 16 TLP пакетов по 4 байта данных, пусть время между TLP пакетами 50нс-100 нс, значит на пересылку 64 байт уйдет 800нс-1600 нс. При дма будет так: хост записывает команду на старт дма, плис посылает TLP пакет на чтение 64 байт, хост отвечает одним TLP пакетом с 64 байтами данных. Где-то 1100 нс выйдет. спасибо, для меня нкжная инфа. А не подскажите, TLP всегда 4 байта? Quote Share this post Link to post Share on other sites More sharing options...
novartis 0 June 9, 2021 Posted June 9, 2021 · Report post 1 minute ago, new123 said: спасибо, для меня нкжная инфа. А не подскажите, TLP всегда 4 байта? нет. Почему вы такой вопрос задали?) TLP пакет содержит заголовок 16 байт и данные. Хост в простейшем случае может послать IO32 запрос на запись или на чтение, для запроса "запись" в TLP пакете будет заголовок 16 байт и 4 байта данных. Если заюзать функцию типа такой _mm256_storeu_si256, то в TLP пакете будет заголовок 16 байт и 32 байта данных. PCIE пакеты.pdf Quote Share this post Link to post Share on other sites More sharing options...
dvladim 0 June 9, 2021 Posted June 9, 2021 · Report post TLP минимального размера состоит из 3-х слов. (разумеется не содержит данных). Пакеты для работы с 32-х разрядным пространством адресов имеют заголовок в 3 слова, с 64-х разрядным - 4 слова. Данные в зависимости от типа пакета. Quote Share this post Link to post Share on other sites More sharing options...
1891ВМ12Я 0 June 9, 2021 Posted June 9, 2021 · Report post 14 hours ago, new123 said: спасибо, для меня нкжная инфа. А не подскажите, TLP всегда 4 байта? 12 байт минимум для 32 битных и 16 байт минимум для 64 битных. Мне непонятно почему на уровне архитектуры процессоров не сделали возможность send_tlp(type, data, size)... Не вижу схемотехнических проблем такового. Quote Share this post Link to post Share on other sites More sharing options...
dxp 213 June 10, 2021 Posted June 10, 2021 · Report post 7 часов назад, AVR сказал: Мне непонятно почему на уровне архитектуры процессоров не сделали возможность send_tlp(type, data, size)... Не вижу схемотехнических проблем такового. Проблемы на уровне ISA. Как вы себе представляете инструкцию CPU, которая умеет метать массивы? Для этого и придумали DMA, а CPU управляет им путём записи в его регистры. Quote Share this post Link to post Share on other sites More sharing options...
alexadmin 2 June 10, 2021 Posted June 10, 2021 · Report post 4 hours ago, dxp said: Проблемы на уровне ISA. Как вы себе представляете инструкцию CPU, которая умеет метать массивы? Ну например как инструкцию REP (x86) ;) Quote Share this post Link to post Share on other sites More sharing options...
dxp 213 June 11, 2021 Posted June 11, 2021 · Report post Эта инструкция может сама метнуть массив? Или таки скомандовать повтор другой инструкции? Quote Share this post Link to post Share on other sites More sharing options...
des00 27 June 11, 2021 Posted June 11, 2021 · Report post On 6/10/2021 at 3:16 AM, AVR said: 12 байт минимум для 32 битных и 16 байт минимум для 64 битных. Мне непонятно почему на уровне архитектуры процессоров не сделали возможность send_tlp(type, data, size)... Не вижу схемотехнических проблем такового. странно, ковырял корку XDMA от хилых, как я понял TLP транзакция там может быть переменного размера, от 4-х до 512 байт. Правда это внутри самой корки. Как это реализовано со стороны CPU я не изучал Quote Share this post Link to post Share on other sites More sharing options...