Оптимизиран memset()

71 отговора 1968 прегледа
#1

Оптимизиран memset()

Някой знае ли от къде мога да сваля оптимизиран memset() за MMX, SSE и SSE2?

Отговор
в отговор на Colombino #2

Re: Оптимизиран memset()

Каква би могла да бъде връзката между MMX, SSE и SSE2 и memset?

Отговор
в отговор на Alex #3

Re: Оптимизиран memset()

Просто търся написан на по-модерен асемблер memset(), който да използва възможностите на съвременните процесори.

Отговор
в отговор на Colombino #4

Re: Оптимизиран memset()

Уверявам те,че няма никаква връзка.Горните нововъведения са за оптимизирано пресмятане на реални числа,а не за установяване на памет в стойност.

Отговор
в отговор на Colombino #5

Re: Оптимизиран memset()

Погледни кода на memset.Microsoft така са я оптимизирали,че подобрението което постигнах беше в 10 - 50 хилядни от секундата за 50MB.Оптимизации при работа с паметта можеш да постигнеш като избягваш стандартните C функции(malloc,realloc,expand,free...) ,а използваш VirtualAlloc and VirtualFree.

Отговор
в отговор на Alex #6

Re: Оптимизиран memset()

neshto sa byrkash
MMX e SAMO za celi chisla...SSE syshto ima wyzmozhnost za rabota s celi oswen s realni...

Отговор
в отговор на Alex #7

Аз пък намерих

Хвърли едно око на това и после разправяй по-бързо е стотици пъти. Още не съм го тествал за коректност.
[линк]

Отговор
в отговор на Alex #8

Объркал съм се нещо:)

Не е по-бързо.

Отговор
в отговор на CALL-151 #10

Re: kakvo po-barzo ima ot REP STOTSx

Не съм специалист. Ако знаеш нещо по-бързо - напиши го. Ако искаш да кажеш, че това използва memset() ... жалко. Аз ще потърся още малко.

Отговор
в отговор на Colombino #11

Re: Оптимизиран memset()

Хмм. Тези неща са напрактика вектроният копроцесор за пентиумите. Не съм сигурен, че ще ти помогнат особено.


Я вышел им наперерез...
Отговор
в отговор на MиГ #12

Re: Оптимизиран memset()

Помагат с това, че ти позволяват да записваш по 8 байта едновременно (MMX), и т.н... Общо взето е само това. Но, наистина, MMX инструкциите са много подходящи за подобни операции с паметта.

Отговор
в отговор на ironcode #13

Re: Оптимизиран memset()

А сигурно ли е, че ги записват едновременно?
При 32-битова шина наведнъж можеш да запишеш само 4, повече няма как.


Я вышел им наперерез...
Отговор
в отговор на MиГ #14

Re: Оптимизиран memset()

Ми едновременно ги записва, да... По-новите процесори даже имат 128-битова шина за данни към кеша. Към паметта е отделен въпрос, но там също си има трикове (къде 64-битова шина, къде друго... някои дъна, например, ако имаш памет в две банки, могат да правят с нея това, което RAID контролера прави с хард дисковете при RAID level 0 - половината данни се записват в едната, половината в другата, и така постигаш два пъти по-голям трафик)...

Така или иначе, хубаво е да се възползваш от възможностите, които процесорът ти предоставя. Дори и да има някакъв bottleneck (например 32-битова шина за данни), със сигурност скоростта няма да е по-малка, отколкото ако го направиш с обикновените инструкции. Ако обаче такова тясно място няма, ще постигнеш реално ускорение.

P.S. DDR паметите използват 64-битова шина за данни. Така че си струва.

Редактирано от ironcode на

Отговор
в отговор на Colombino #15

Абе то хубаво MMX

ама като stos е по-бързо...

Отговор
в отговор на ironcode #16

Re: Оптимизиран memset()

Може и да записва по 8 байта, може и да не записва.
Но аз си мисля за два други въпроса:

1) Доколко програма писана с такава функция ще работи (ефективно и въобще) и на други процесоти и дъна?

2) Каква част от вашата програма заема memset () че сте седнали да икономисване няколко микросекунди?

Отговор
в отговор на Гeнчo #17

Re: Оптимизиран memset()

Ами то си зависи до програмата, ако има операции с матрици, или големи потоци от данни, и т.н., тогава си струва човек да се възползва, и спестеното време няма да се измерва в микросекунди, а в доста по-големи интервали. Колкото до вървенето на други процесори - тук вече трябва сериозно да се помисли. Всички съвременни процесори поддържат MMX, така че тези инструкции може сравнително безопасно да се използват. С 3DNow!, 3DNow2!, SSE и SSE2 вече нещата са доста по-сложни, но пак има решение - може да се напише по един memset за всеки набор от инструкции, и в началото на работата на програмата еднократно да се тества кое се поддържа от процесора, и от тук нататък да си се ползва то. Този тест ще отнеме някоя и друга милисекунда, но това време на по-късен етап може да се изплати. И пак да кажа, че всичко си зависи от програмата, която ще се пише

Отговор
в отговор на Гeнчo #18

Re: Оптимизиран memset()

От твоята не знам, ама от моята е съществена. За кеф ли мислиш, че го търся?

Отговор
в отговор на Alex #19

Re: Оптимизиран memset()

realni chisla? !?!?
ne stawai smeshen :)
da ne goworim che komputrite s takiwa ne se oprawiat, ama hich :)

Отговор
в отговор на Гeнчo #20

Re: Оптимизиран memset()

Искам да кажа, че една inline оптимизация при компилиране свежда memset () до асемблерските команди REP STOS...
Силно се съмнявам че MMX-оптимизации биха довели до съществено ускоряване. А и то ще бъде изядено от overhead-а на функцията.

Погледнете в асемблерския код на GDI, там си е чисто REP-STOS.

Помислете: ако memset () заема 25% от времето на изпълнение (при повече егати тъпата програма!), и вие го ускорите 100% (не вярвам!), самата програма ще се ускори колко?! - 12.5 %. А горните числа със сигурност са по-малки.

Отговор