Перейти к содержанию
    

PCI-E интерфейс в Qsys на Cy IV GX

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 и тд), проверено точно из самой плис, фиксировал там данные.

Изменено пользователем new123

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 совершенно непонятно. Но если скорость достаточная в теории, то даже если быстрее, есть еще критерий как проще и достаточно ли будет такого решения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, AVR said:

Как это делать на Nios+PCIE совершенно непонятно. Но если скорость достаточная в теории, то даже если быстрее, есть еще критерий как проще и достаточно ли будет такого решения.

Как на nios, увы. Я этого зверя никогда не делал. Так в принципе вам уже один совет дали.
Мой подход был таков:
1) Делаю в pcie корке любой доступный BAR (BAR0 обычно занят DMA движком, можно брать BAR1-BAR2). Ставлю ему нужный сайз.

2) На pcie появляется разделы.
image.thumb.png.170bfaf71d44d0a3438baff12e39f457.png

3) Ну а дальше в линуксе дело техники. Либо его в своем драйвере подключаем и юзаем iowrite32
4) Либо, делаем map на файл вида /sys/bus/pci/devices/0000:02:00.0/resource2 (нужный адрес подставить самому)

И пишем прям в него. Ну или читаем.

 

upd.
5) Забыл самое главное написать ). После активации BAR1-2 в корке, появляется порт вида BAR2... или как то так. Типа Avalon. И сажаем на него, что душе угодно. Можно on_chip_memory к примеру, можно что нибудь свое и тд. Оно и появится в линуксе

Изменено пользователем new123

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 параллельно ниосу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, novartis said:

Чтобы хосту записать в плис по pcie 64 байта, нужно отправить 16 TLP пакетов по 4 байта данных, пусть время между TLP пакетами 50нс-100 нс, значит на пересылку 64 байт уйдет 800нс-1600 нс.
При дма будет так: хост записывает команду на старт дма, плис посылает TLP пакет на чтение 64 байт, хост отвечает одним TLP пакетом с 64 байтами данных. Где-то 1100 нс выйдет.

 

спасибо, для меня нкжная инфа. А не подскажите, TLP всегда 4 байта?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, new123 said:

спасибо, для меня нкжная инфа. А не подскажите, TLP всегда 4 байта?

нет. Почему вы такой вопрос задали?)
TLP пакет содержит заголовок 16 байт и данные.

Хост в простейшем случае может послать IO32 запрос на запись или на чтение, для запроса "запись" в TLP пакете будет заголовок 16 байт и 4 байта данных.

Если заюзать функцию типа такой _mm256_storeu_si256, то в TLP пакете будет заголовок 16 байт и 32 байта данных.

PCIE пакеты.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

TLP минимального размера состоит из 3-х слов. (разумеется не содержит данных).

Пакеты для работы с 32-х разрядным пространством адресов имеют заголовок в 3 слова, с 64-х разрядным - 4 слова. Данные в зависимости от типа пакета.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 hours ago, new123 said:

спасибо, для меня нкжная инфа. А не подскажите, TLP всегда 4 байта?

12 байт минимум для 32 битных и 16 байт минимум для 64 битных.
Мне непонятно почему на уровне архитектуры процессоров не сделали возможность send_tlp(type, data, size)... Не вижу схемотехнических проблем такового.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, AVR сказал:

Мне непонятно почему на уровне архитектуры процессоров не сделали возможность send_tlp(type, data, size)... Не вижу схемотехнических проблем такового.

Проблемы на уровне ISA. Как вы себе представляете инструкцию CPU, которая умеет метать массивы? Для этого и придумали DMA, а CPU управляет им путём записи в его регистры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, dxp said:

Проблемы на уровне ISA. Как вы себе представляете инструкцию CPU, которая умеет метать массивы?

Ну например как инструкцию REP (x86) ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эта инструкция может сама метнуть массив? Или таки скомандовать повтор другой инструкции?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/10/2021 at 3:16 AM, AVR said:

12 байт минимум для 32 битных и 16 байт минимум для 64 битных.
Мне непонятно почему на уровне архитектуры процессоров не сделали возможность send_tlp(type, data, size)... Не вижу схемотехнических проблем такового.

странно, ковырял корку XDMA от хилых, как я понял TLP транзакция там может быть переменного размера, от 4-х до 512 байт. Правда это внутри самой корки. Как это реализовано со стороны CPU я не изучал

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...