Оптимизиран memset()
71 отговора
1968 прегледа
Оптимизиран memset()
Някой знае ли от къде мога да сваля оптимизиран memset() за MMX, SSE и SSE2?
Re: Оптимизиран memset()
Каква би могла да бъде връзката между MMX, SSE и SSE2 и memset?
Re: Оптимизиран memset()
Просто търся написан на по-модерен асемблер memset(), който да използва възможностите на съвременните процесори.
Re: Оптимизиран memset()
Уверявам те,че няма никаква връзка.Горните нововъведения са за оптимизирано пресмятане на реални числа,а не за установяване на памет в стойност.
Re: Оптимизиран memset()
Погледни кода на memset.Microsoft така са я оптимизирали,че подобрението което постигнах беше в 10 - 50 хилядни от секундата за 50MB.Оптимизации при работа с паметта можеш да постигнеш като избягваш стандартните C функции(malloc,realloc,expand,free...) ,а използваш VirtualAlloc and VirtualFree.
Re: Оптимизиран memset()
neshto sa byrkash
MMX e SAMO za celi chisla...SSE syshto ima wyzmozhnost za rabota s celi oswen s realni...
MMX e SAMO za celi chisla...SSE syshto ima wyzmozhnost za rabota s celi oswen s realni...
Аз пък намерих
Хвърли едно око на това и после разправяй по-бързо е стотици пъти. Още не съм го тествал за коректност.
[линк]
[линк]
Re: kakvo po-barzo ima ot REP STOTSx
Не съм специалист. Ако знаеш нещо по-бързо - напиши го. Ако искаш да кажеш, че това използва memset() ... жалко. Аз ще потърся още малко.
Re: Оптимизиран memset()
Хмм. Тези неща са напрактика вектроният копроцесор за пентиумите. Не съм сигурен, че ще ти помогнат особено.
Я вышел им наперерез...
Я вышел им наперерез...
Re: Оптимизиран memset()
Помагат с това, че ти позволяват да записваш по 8 байта едновременно (MMX), и т.н... Общо взето е само това. Но, наистина, MMX инструкциите са много подходящи за подобни операции с паметта.
Re: Оптимизиран memset()
А сигурно ли е, че ги записват едновременно?
При 32-битова шина наведнъж можеш да запишеш само 4, повече няма как.
Я вышел им наперерез...
При 32-битова шина наведнъж можеш да запишеш само 4, повече няма как.
Я вышел им наперерез...
Re: Оптимизиран memset()
Ми едновременно ги записва, да... По-новите процесори даже имат 128-битова шина за данни към кеша. Към паметта е отделен въпрос, но там също си има трикове (къде 64-битова шина, къде друго... някои дъна, например, ако имаш памет в две банки, могат да правят с нея това, което RAID контролера прави с хард дисковете при RAID level 0 - половината данни се записват в едната, половината в другата, и така постигаш два пъти по-голям трафик)...
Така или иначе, хубаво е да се възползваш от възможностите, които процесорът ти предоставя. Дори и да има някакъв bottleneck (например 32-битова шина за данни), със сигурност скоростта няма да е по-малка, отколкото ако го направиш с обикновените инструкции. Ако обаче такова тясно място няма, ще постигнеш реално ускорение.
P.S. DDR паметите използват 64-битова шина за данни. Така че си струва.
Така или иначе, хубаво е да се възползваш от възможностите, които процесорът ти предоставя. Дори и да има някакъв bottleneck (например 32-битова шина за данни), със сигурност скоростта няма да е по-малка, отколкото ако го направиш с обикновените инструкции. Ако обаче такова тясно място няма, ще постигнеш реално ускорение.
P.S. DDR паметите използват 64-битова шина за данни. Така че си струва.
Редактирано от ironcode на
Re: Оптимизиран memset()
Може и да записва по 8 байта, може и да не записва.
Но аз си мисля за два други въпроса:
1) Доколко програма писана с такава функция ще работи (ефективно и въобще) и на други процесоти и дъна?
2) Каква част от вашата програма заема memset () че сте седнали да икономисване няколко микросекунди?
Но аз си мисля за два други въпроса:
1) Доколко програма писана с такава функция ще работи (ефективно и въобще) и на други процесоти и дъна?
2) Каква част от вашата програма заема memset () че сте седнали да икономисване няколко микросекунди?
Re: Оптимизиран memset()
Ами то си зависи до програмата, ако има операции с матрици, или големи потоци от данни, и т.н., тогава си струва човек да се възползва, и спестеното време няма да се измерва в микросекунди, а в доста по-големи интервали. Колкото до вървенето на други процесори - тук вече трябва сериозно да се помисли. Всички съвременни процесори поддържат MMX, така че тези инструкции може сравнително безопасно да се използват. С 3DNow!, 3DNow2!, SSE и SSE2 вече нещата са доста по-сложни, но пак има решение - може да се напише по един memset за всеки набор от инструкции, и в началото на работата на програмата еднократно да се тества кое се поддържа от процесора, и от тук нататък да си се ползва то. Този тест ще отнеме някоя и друга милисекунда, но това време на по-късен етап може да се изплати. И пак да кажа, че всичко си зависи от програмата, която ще се пише 
Re: Оптимизиран memset()
От твоята не знам, ама от моята е съществена. За кеф ли мислиш, че го търся?
Re: Оптимизиран memset()
realni chisla? !?!?
ne stawai smeshen :)
da ne goworim che komputrite s takiwa ne se oprawiat, ama hich :)
ne stawai smeshen :)
da ne goworim che komputrite s takiwa ne se oprawiat, ama hich :)
Re: Оптимизиран memset()
Искам да кажа, че една inline оптимизация при компилиране свежда memset () до асемблерските команди REP STOS...
Силно се съмнявам че MMX-оптимизации биха довели до съществено ускоряване. А и то ще бъде изядено от overhead-а на функцията.
Погледнете в асемблерския код на GDI, там си е чисто REP-STOS.
Помислете: ако memset () заема 25% от времето на изпълнение (при повече егати тъпата програма!), и вие го ускорите 100% (не вярвам!), самата програма ще се ускори колко?! - 12.5 %. А горните числа със сигурност са по-малки.
Силно се съмнявам че MMX-оптимизации биха довели до съществено ускоряване. А и то ще бъде изядено от overhead-а на функцията.
Погледнете в асемблерския код на GDI, там си е чисто REP-STOS.
Помислете: ако memset () заема 25% от времето на изпълнение (при повече егати тъпата програма!), и вие го ускорите 100% (не вярвам!), самата програма ще се ускори колко?! - 12.5 %. А горните числа със сигурност са по-малки.