· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Работа с КЭШЕМ!!!

. 1 . 2 . 3 . 4 . 5 . >>

Посл.отвђт Сообщенiе


Дата: Июл 15, 2003 16:47:08

Кто работал с кэшем!! Подскажите пожалуйста! Как и где мне можно его использовать для ускорения проги!!! Очень нужно!!!
Заранее благодарен!


Дата: Июл 15, 2003 16:59:39

emergenter
С кешем в проце?
Читай статьи Агнера Фога про оптимизации. (Они здесь)


Дата: Июл 15, 2003 17:17:24

Теорию я знаю!! Что нибудь из практики!!!


Дата: Июл 15, 2003 17:26:36

Берешь и пишешь циклы так, чтобы размер кода помещался в размер кеша :)


Дата: Июл 15, 2003 17:27:03

emergenter
Если ты знаешь теорию, то тогда должен понимать, что влиять на кешь практически нельзя, не говоря о некоторых командах, начиная с 486 которые подсказывают компу какие данные ложить в кеш + некоторые команды для MMX, SSE и AMD расширений.
Что до практики, то можно рассмотреть какой нибудь пример, и его обсудить...
А так, я не знаю, что можно ответить.


Дата: Июл 15, 2003 17:41:07

Хорошо!! Ну например!!!! Цикл!! Правильно!!
float mas1[1000];- первый массив
float mas2[250]; - второй массив
float rez[1000]; - массив результата
где значения:
mas[i]=i+0,1;
mas[j]=2+0.j; пусть
Ну допустим!! Это дано!!! (чтобы было понятно что дано я написал на C так короче и понятнее!!)
--------------------------------
.code
mov ecx,250
xor esi,esi
xor edi,edi
cikl:
movaps xmm1,[mas+esi]
movss xmm2,[mas2+edi]
unpcklps xmm2,xmm2
unpcklps xmm2,xmm2
mulps xmm1,xmm2
movaps [rez],xmm1

add esi,16
add edi,4
test ecx,ecx
jnz cicl

end:
И как тут поступить с четырме командами КЭША!! Ты мне политику объяни!!!


Дата: Июл 15, 2003 22:35:56

А под какую ОС пишем? Если под многозадачную то (лично мне кажется) это неимеет смысла т.к. в системе с количеством процессоров меньше чем количество потоков кеш будет заливаться при каждом переключении между потоками. Поправьте меня если я не прав.


Дата: Июл 16, 2003 12:11:30

pas
Ты не прав.
По твоему переключение между потоками так быстро, что кеш не нужен? Ничего подобного.
Я только скажу, что на среднестатистической многозадачной машине время отводимое под поток достаточно велико.


Дата: Июл 16, 2003 12:12:54

где значения:
mas[i]=i+0,1;
mas[j]=2+0.j;

Что-то я не отчень понял это условие, но исходя из кода пример ясен.

Однако что Вы всё таки желаете услышать?
Команды PREFETCHTx не более чем подсказки, их можно конечно вызвать до начала цикла.
А потом они не имеют отношения к линейкам кеша, за которые вы боритсь.
В вашем случае вы имеете два массива, то есть по массиву на одну 32 байтную линейку.
В любом случае, если выравнивание данных не будет отвечать 32 байтной границе
эффекта кеширования вы не добьётесь.

Что касается теории, то "управление кешем" следует понимать как
попытку прочитать(записать) то, что нам надо.
Можно считать, что каждое обращение к адресу выравненому по 32 байтной границе
с вероятностью 80% вызывает заполнение строки кеша.
При чём, если таких строк много, то "новой" строки.
И вот это важно. Скажем так, что команды
movaps xmm1,[mas+esi] 	;; Заполнение строки 0
movaps xmm2,[mas2+edi] 	;; Заполнение строки 1

Скажем так же, что данные стоящие в рядом в 32 байтном сегменте точно попадают в кеш!!!
+ Да, и ещё в данном случае, имея два массива мы можем расположить их в памяти так, чтобы они отвечали условию различных 5-11 бита.
Это ещё одна гарантия, что будут использоваться разные линии кеша

Кроме того, в вашем случае мы имеем так называемое "Идеальное условие".
Размер одного массива равен точно 4 части другого.

Я бы переписал код так:
.code 
mov ecx,250 
xor esi,esi 
xor edi,edi 
;;-=-=-=-=-=-=-==-=-=-=
cikl: 
movaps 		xmm0,[mas2+edi]   ; В одну линейку
; Почему +32?
; Потому что в начале будут готовы результаты для 
; этой части чисел.
movaps 		xmm7,[mas+esi+32]    ; В другую...
;; Мы упаковываем второе число во все числа 
;; xmm1, xmm2
movaps		xmm3,xmm0
movaps		xmm2,xmm0
; Этого в кеше не было. Но оно должно
; пойти ещё в одну линейку
; Пардон, получилось немного запутанно. Но что поделаешь.
movaps 		xmm6,[mas+esi]
shufps		xmm3,xmm0,11111111b ; третие число
shufps		xmm2,xmm0,10101010b ; второе число
movaps		xmm1,xmm0
; Вот именно ради этого были эти + 32
; Кстати две mulps в принципе могут спарится.
; [mas+esi+32+16] должно быть в кеше, потому что было 
; [mas+esi+32]
mulps 		xmm2,xmm7
mulps 		xmm3,[mas+esi+32+16]
; Эти инструкции не спарятся :( А ну их... 
; всё равно это далеко от совершенства.
shufps		xmm1,xmm0,01010101b
shufps		xmm0,xmm0,00000000b
mulps 		xmm1,[mas+esi+16]  ; Это должно быть в кеше
mulps 		xmm0,xmm6

;; Вообще-то и это нужно было продумать...
movaps [rez+0h],xmm0
movaps [rez+16],xmm1 
movaps [rez+32],xmm2 
movaps [rez+48],xmm3 

add esi,16*4
add edi,4*4
; Да , тут команды не хватает
sub  ecx,1*4
test ecx,ecx 
jnz cicl 

end: 

Всё это очень далеко от совершенства, но путь правильный.
Да, я его в голове компилировал, так что без притензий :)))


Дата: Июл 16, 2003 15:34:26

EdmondЧо то ты тут не то замутил!!! Причем тут команда пересылки 128 бит из памяти в xmm регистр и КЭШ???? И смысл ты тут вроде не уловил!!!
Есть 2 массива: mas1 и mas2!!!
нужно каждые 4 числа по 4 байта массива mas1 умножить на 1 одно число = 4 байта и другого!!!
т.е. нужно извлекать 4 числа из mas1, а из mas2 извлекать только одно число!! и умножать!! У тебя же что то вообще навороченно не то!! Конечно рассуждения по КЭШ толковые и даже очень!!! Только нужно знать что требуется... (что я и написал).
Если можно еще раз только под эту задачу ок!!
А это массивы:
где значения:
for(i=0;i<1000;i++)
{
mas1[i]=i+0,1;
}

for(j=0;j<250;j++)
{
mas2[j]=2+0.j;
}


Дата: Июл 16, 2003 15:43:19

emergenter
нужно каждые 4 числа по 4 байта массива mas1 умножить на 1 одно число = 4 байта и другого!!!
ЭЭЭ, я именно это и сделал.
У тебя же что то вообще навороченно не то!! Конечно рассуждения по КЭШ толковые и даже очень!!! Только нужно знать что требуется... (что я и написал).
У меня всё просто.
Просто я сразу умножаю четыре*4 числа из mas1 на соответствующие 4 числа из mas4

Вот и всё.


Дата: Июл 16, 2003 15:44:39

Да, мне интересно какой должен быть прирост.
50% или 200%?
Иногда в таких фокусах я выигрывал в 4 раза..


Дата: Июл 16, 2003 15:51:41

Ты словами можешь написать что и куда нужно подать!! Т.к. в ассемблерный текст с ошибками смотря... Т.е. идея может она и есть какая то но в этом коде разобраться может только хозяин!!
Это вообще не ясно!!
; Почему +32?
; Потому что в начале будут готовы результаты для
; этой части чисел.
movaps xmm7,[mas+esi+32] ; В другую...

т.к. в регистре xmm7 будут находится числа массива mas1
по номеру
2,3,4,5 !!! А куда 1 денется???? проверь еще разок!!!


Дата: Июл 16, 2003 15:58:54

Что то ты явно не разобрался в синтаксисе написания под SSE!! даже по-моему с чем-то напутал инструкцию movaps??? Это пересылка 128 бит (повторюсь!!!)
mulps xmm3,[mas+esi+32+16]
ОТКУДА ВЗЯЛОСЬ +16!! Я даже не знаю что ты тут имел в виду, если у нас одно значение занимает 32 бита??????? как может быть смещение 16???? это что мы пол числа захватим??


Дата: Июл 16, 2003 16:09:03

Опс! На счет последнего!! Беру слова обратно!!! Извините! Я не прав!!!

. 1 . 2 . 3 . 4 . 5 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.057