|
|
| Посл.отвђт | Сообщен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 Опс! На счет последнего!! Беру слова обратно!!! Извините! Я не прав!!! |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.057 |