Я написал матрицу-матрицу (32-битные поплавки) функцию умножения в C++, используя встроенные средства для больших матриц (8192x8192), минимальный размер данных 32B для каждой операции чтения и записи.32B куски, смежные и несмежные обращения к памяти
Я изменю алгоритм на блокирующий, чтобы он считывал блок 8x8 в 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......
Я имею в виду скорость чтения памяти, а не кэш.
Примечание: Im использует fx8150, и я не знаю, может ли он читать более 32B в одной операции.
Пока у вас есть постоянный шаг автоматической предвыборки на большинстве современных процессоров будет делать хорошую работу. Может быть некоторая неэффективность из-за использования неполных строк кеша, но, как и все, единственным реальным способом узнать наверняка является реализация и сравнение обоих методов. –
Может ли он автоматически увеличивать пробег в 32 КБ? –
Почему вы заботитесь о скорости памяти, а не о кеше? вы находитесь на x86, поэтому вам следует оптимизировать кеш и, следовательно, избегать блоков 8x8. 8x8 будет вариантом для 2d когерентных кешей, которые в основном используются в графических процессорах. –