Я хочу выполнить 64-байтовую транзакцию на PCIe. Я использую процессор Intel i7 9-го поколения.
Я смог выполнить 64-байтную транзакцию записи в память устройства PCIe, сделав ее областью WC, и записал данные следующим образом:
_mm256_store_si256(pcie_memory_address, ymm0);
_mm256_store_si256(pcie_memory_address+32, ymm1);
_mm_mfence();
Я попробовал 64-байтовое чтение с помощью инструкции:
_mm256_loadu_si256();
Используется как запись, но здесь чтение происходит как чтение 2* 32-байт.
Кто-нибудь может мне с этим помочь? Я хочу сделать 64-байтовое чтение как один пакет.
Я ссылался на документацию Intel по этой ссылке: https://www.intel.com/content/dam/www/public/us/en/documents/white-papers/pcie-burst-transfer-paper.pdf
WC
, эта функция предназначена для объединения записи в память. Вы можете найти некоторую информацию о том, как это работает здесь. По сути, у процессора есть пара 64-байтовых регистров, в которых он может буферизовать записи (невременные или в памятьwc/uc
), поэтому несколько отдельных операций записи (в идеале) объединяются в одну транзакцию шины. Буферы не загружаются, и вы не хотите загружать изwc
памяти, если это вообще возможно. Возможно, AVX512 позволяет одной 64-байтовой загрузке вызывать одну шинную транзакцию, но я не уверен в этом. - person EOF   schedule 16.05.2020_mm256_loadu_si256()
на_mm_stream_load_si128()
, сохранив при этом памятьwc
. Это должно извлекать 64-байтовую кэш-линию за одну транзакцию в буфер заполнения. Вторая выровненная 32-байтная загрузка из той же кэш-линии не должна вызывать вторую шинную транзакцию, если буфер заполнения не был вытеснен в промежутке (но вы не всегда можете предотвратить это, в зависимости от таких вещей, как чтение для владения несвязанные кэш-линии других процессоров). - person EOF   schedule 16.05.2020