2013-07-27 7 views
0

Я написал матрицу-матрицу (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 в одной операции.

+0

Пока у вас есть постоянный шаг автоматической предвыборки на большинстве современных процессоров будет делать хорошую работу. Может быть некоторая неэффективность из-за использования неполных строк кеша, но, как и все, единственным реальным способом узнать наверняка является реализация и сравнение обоих методов. –

+0

Может ли он автоматически увеличивать пробег в 32 КБ? –

+0

Почему вы заботитесь о скорости памяти, а не о кеше? вы находитесь на x86, поэтому вам следует оптимизировать кеш и, следовательно, избегать блоков 8x8. 8x8 будет вариантом для 2d когерентных кешей, которые в основном используются в графических процессорах. –

ответ

1

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

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

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

+0

Шаг составляет порядка 8192 элементов (или разность 32 кБ). Иногда размером до 512 элементов (разница 2 кБ) –

+0

Насколько плохо каждый раз обращается к другому сегменту? –

+0

Это хуже, но трудно сказать, не зная точно, что делает контроллер памяти, какой тип памяти у вас есть (например, память 27-9-9-9-9 будет лучше, чем 32-12-12-12 -12). Чем дальше, тем больше вероятность того, что у вас есть «открыть новую страницу», один из контроллеров памяти - обычно страница 4KB (нет, не такая же, как «страница» в обработке виртуальной памяти).Это также зависит от того, как долго фактическая математика использует данные - и даже если вы показали мне код, и у меня были точные тайминги каждой инструкции, часто трудно судить о том, как процессор блокирует инструкции. –