Оптимизация обращений
От: WoldemaR Россия  
Дата: 02.10.06 14:06
Оценка:
Ситуация следующая:

есть большой массив(объём — мегабайты) из которого обрабатывается 1 строка (объём — килобайты).

Обращения к этой строке происходят очень часто внутри больших циклов.

адрес обращения вычисляется, но всегда остаётся в рамках строки.

есть подозрение, что каждый раз происходит обращение к памяти, хотя (внимание) вся строка может поместиться в кеш процессора.

вопрос — можно ли сказать компилятору чтобы он поместил в кеш некий участок памяти,
а если нельзя, то как можно оптимизировать такую ситуацию?
Re: Оптимизация обращений
От: SergH Россия  
Дата: 02.10.06 14:25
Оценка: 4 (1)
Здравствуйте, WoldemaR, Вы писали:

WR>Ситуация следующая:


WR>есть большой массив(объём — мегабайты) из которого обрабатывается 1 строка (объём — килобайты).


WR>Обращения к этой строке происходят очень часто внутри больших циклов.


WR>адрес обращения вычисляется, но всегда остаётся в рамках строки.


WR>есть подозрение, что каждый раз происходит обращение к памяти, хотя (внимание) вся строка может поместиться в кеш процессора.


Это странно, вроде кеш для такой ситуации и разрабатывали: есть большая память, обращение происходит к небольшому кусочку, адрес вычисляется...

Такое может быть, если помимо этой строчки постоянно обращаешься ещё куда-то, тогда несколько областей памяти поочереди прописываются в кеш. Но, к счастью, обычно кеш многослойный — как минимум, двух, так что на стек и большой массив должно хватать.

WR>вопрос — можно ли сказать компилятору чтобы он поместил в кеш некий участок памяти,


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

WR>а если нельзя, то как можно оптимизировать такую ситуацию?


Наверное, сократить обращения к другим участкам памяти и выровнять по границе кеш-линии.
Делай что должно, и будь что будет
Re: Оптимизация обращений
От: korzhik Россия  
Дата: 03.10.06 06:58
Оценка:
Здравствуйте, WoldemaR, Вы писали:

WR>Ситуация следующая:


WR>есть большой массив(объём — мегабайты) из которого обрабатывается 1 строка (объём — килобайты).


WR>Обращения к этой строке происходят очень часто внутри больших циклов.


WR>адрес обращения вычисляется, но всегда остаётся в рамках строки.


WR>есть подозрение, что каждый раз происходит обращение к памяти, хотя (внимание) вся строка может поместиться в кеш процессора.


WR>вопрос — можно ли сказать компилятору чтобы он поместил в кеш некий участок памяти,

WR>а если нельзя, то как можно оптимизировать такую ситуацию?

можно воспользоваться программной загрузкой в кэш: смотри семейство команд prefetch
Но это дело, как я понял (сам не использовал), хитрое, но попробовать можно.
Re: Оптимизация обращений
От: Pavel Dvorkin Россия  
Дата: 03.10.06 07:43
Оценка:
Здравствуйте, WoldemaR, Вы писали:

WR>есть подозрение, что каждый раз происходит обращение к памяти, хотя (внимание) вся строка может поместиться в кеш процессора.


Это подозрение не мешало бы доказать. К примеру, сравнить текущую ситуацию со специальным тестом, где доступ к мегабайтному файлу будет за такими же по размеру порциями, но по случайному адресу.
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.