32B куски, смежные и несмежные обращения к памяти

Я написал функцию умножения матрица-матрица (32-битные числа с плавающей запятой) на C ++, используя встроенные функции для больших матриц (8192×8192), минимальный размер данных составляет 32B для каждой операции чтения и записи.

Я изменю алгоритм на блокирующий, так что он считывает блок 8×8 в 8 регистров YMM и выполняет умножения в строках целевых блоков (другой регистр YMM в качестве целевого), в конечном итоге накапливая 8 результатов в другом регистре и сохраняя в памяти.

Вопрос: Имеет ли значение, если он получает куски 32B с несмежных адресов? Значительно ли это меняет производительность, если она выглядит так:

Read 32B from p, compute, read 32B from p+8192 (this is next row of block), compute,
Read and compute until all 8 rows are done,  write 32B to target matrix row p3

вместо

Read 32B from p, compute, read 32B from p+32, compute, read 32B from p+64......

Я имею в виду скорость чтения памяти, а не кеша.

Примечание: я использую fx8150, и я не знаю, может ли он прочитать более 32B за одну операцию.

0

Решение

Будет наверное дать вам лучшую производительность, чтобы иметь один непрерывный буфер (по крайней мере, это не хуже!).

Насколько велика разница в производительности, будет зависеть от большого количества факторов (и, конечно, если вы выделите кучу блоков из 32 байт, вы, скорее всего, получите «близко друг к другу» куски памяти, поэтому преимущество кэширования все равно будет В худшем случае, если каждый блок находится в отдельном сегменте памяти размером 4 КБ, но если у вас есть несколько байтов «пустого пространства» между каждым блоком, не так уж и много.

Как и многие другие вопросы производительности, это в значительной степени связано с точными деталями того, что делает код, типами памяти, типом процессора и т. Д. Единственный способ ДЕЙСТВИТЕЛЬНО выяснить это, вам нужно будет сравнить различные варианты …

1

Другие решения

Других решений пока нет …