<bgdev />free

| |  


All tags 2023 9may ai algorithm alpha amd american api argon2 arm asm asmbb assembler attachment awareness balgaria bay888 bcrypt bender beta bgdev-next bgdev-next.👍 big.data bitchnigga bitcoin bmw boi borg brexit bug bulgaria business c cad chat cloud computer-names console crossorigin deprivation desktop dna dotnet email eupl falling feature forum foundation fp fresh fun game gcc github goats google gpl gpt gpt.3.5 gypsies happiness harvard hash improvement include investment it java javascript js kleta kleta.maqka.balg lambi language learning leftovers legend level levenshtein.dist libx license linkedlist linux m0 ma mcafee mele microsoft minimag minimalism negro net nginx nigga not.a.bug oop paradigm parler patterns perception persuasion pipe play.station politics populi pornhub pow pro programming protonmail python reba rust sci-fi scripting seks seo server shell sleep smartbeauty soft-skills sqlite srabska sse starship sugerface syntax tablet tailwindcss telegram theme thug troll80lvl tutanota typescript uacme ui uk unix untermensch upload uptime usa utilities ux vb via viber virtual.reality vox vps vulnerable war wasm weapons-grade web windows word x86 xbox xss youtube zig ziglang Übermensch БОКЕБЪЛГАРИН БЪ БЪлгария Белезниците Били Били.Белезниците БялДонор Веган Виста Възраждане ГЛУПАК Гана Глиста ЕС Казарма Копейкин Мода.и.овча.мисъ НЕКАДЪРНИК НРБ ПО-ЗЛЕ.И.ОТ.РАБИ Подкасти Разни Румен СИК СКУМ СетенЧук Скум ТИР Туче Украйна Урсула Яначков авангард аз айфонджия алгоритми амбиции анархизъм антиваксъри армения аудио аутисти бази.данни бакъп без без.пръчове безпросвета бенчмарк биготи биомаса бира боклук борисов ботев брадва булшит бъг бъгове бял ваксина вандал век венерика викинги вицове вишу война вървежен гана ганорник гей гейщина германия герои гешев глупак говеда групировка гюбек данъкоплатец двойни.стандарти дедотия демокрация дизайн дисциплина добитък докери долар донори држава дришльо дрон ебане еврогейски.съюз езици експеримент електроника електроника.s2 емиграция ендпойнт енум ерген ергономия жалкар задача затоплизъм защита здраве златен злато игри идеали идиократ идиократи идиокрация идиот избори избори.рабин изкуство икономика имбецили имейл инвестиране инокулация инструмента интервю ипад искам.да.си.реда казах камшикодържач капитализъм карабах караница картечница кино клавиатура ковид19 колайдер колям.кур комари комплексар комунизъм консолидация конспирации космонавтика кофа кофит-19 краставица криптовалути курви кучелюбци лайно лаладжия лаптоп либерастия литература лоши.практики луд лъжеучени лъжец любов майни майтапи малоумници мафия мениджмънт месо местене метавселена метафизика механика мистика мисъл мода мода.овча.мисъл модерация морал мутра мутри наука национализъм не.it негър некадърник некадърници неон нидерландия овча овчи олигофрени организация офтопик парички партия педал пенджури пенсия пишока плюскане победа погромист поезия политика порно посредствен почивка празници прасе превод предалщина програмиране проект проста простотии против.правилата проф пръч пръч.дришльо пръчка психика психични.болести психология пустиняк путин путката путьо рабин рабин.е.шибан.пе работа радост разврат разни разработка расизъм резерват рейтинг реклама рекламен религия рест ризи ропче ропчета русия руски.език рутина самоковска сасипаха секира село селяндур сериали сериозно.програм сетен сеянин симулация скопяване скръм слушалки сортиране софия софтуер софтуни социализъм спектрометър спринтове сране стандарти стил стуйо стюи сушилня сцена съвет съм сън сървър сърничка таб ташаци телевизия тема територията терминология термояд технологии титли традиция тролинг тръмп туба туче тъпак тъпанари тъпня уиндоус украйна умнокрасивци фалит фантастика фашизъм фейк.акаунти физика филми форум форумни.проекти футбол хазарт хамали харабия хардуер хахаха хомофобия хостинг храна хумор цайко цайси целофан цензура цензурра циганин чалга чалгар чекии чернокраки честота чипове чнг чужбина чук шпация щайга юан яката яко ям 🔨 😂 🪓


neon

  

0 1 2


  waldorf  Създадено на 18.11.2024, видяно: 401 пъти. #127756

n times faster than C, Arm edition



  |  Създадено на 18.11.2024, видяно: 377 пъти. #127767

Да, llvm е доста добър във векторизацията на такива елементарни цикли. Проблемите са с многомерни масиви. Донякъде ми се иска да видя какви биха били резултатите със SVE(2) и SME, но вероятно ще ме домързи. Ако си спомням правилно, инструкциите на SVE няма да крашнат ако данните които четеш излязал от валидното адресно пространство и с разни хватки с предикати скоростта може би ще е бърза и без да се дава дължината на стринга.



  BIGBUGEX  Последно редактирано на 18.11.2024 от BIGBUGEX, видяно: 358 пъти. #127770
#include <immintrin.h>
#include <cstdio>

int spcalc( const char *data ) {
	long long idata32 = (long long)data & -32LL;
	unsigned offset = (unsigned)(unsigned long long)data & 31, valid, zerof, sf, pf;
	__m256i *ym_data = (__m256i*)idata32,
		ym_s = _mm256_broadcastb_epi8( *(__m128i*)"s" ),
		ym_p = _mm256_broadcastb_epi8( *(__m128i*)"p" ),
		ym_z = _mm256_xor_si256( ym_s, ym_s ),
		ym_c;
	;
	int res;
	
	valid = -1 << offset;
	ym_c = *ym_data++;
	zerof = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_z ) );
	valid &= zerof ^ (zerof - 1);
	sf = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_s ) );
	pf = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_p ) );
	res = __builtin_popcount( sf & valid ) - __builtin_popcount( pf & valid );
	zerof &= valid;
	
	while( !zerof ) {
		ym_c = *ym_data++;
		zerof = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_z ) );
		valid = zerof ^ ( zerof - 1 );
		sf = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_s ) );
		pf = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_p ) );
		res += __builtin_popcount( sf & valid ) - __builtin_popcount( pf & valid );
	}
	
	return res;
}

int main() {
	printf( "%i\n", spcalc( "eeeeesssssppppp" ) );
	
	return 0;
}

Тва е за х64 с - mavx2. Не съм го мерил за скорост. Би трябвало да изрине всеки арм заради 256 битовите вектори и специфичните инструкции.

ПС: Взех домейн. Остава да напиша форум на С++ като съм по-свободен. Рабина там ще е позволен дивеч.



  Rabin  Създадено на 18.11.2024, видяно: 342 пъти. #127773
BIGBUGEX

ПС: Взех домейн. Остава да напиша форум на С++ като съм по-свободен. Рабина там ще е позволен дивеч.

https://github.com/Azareal/cppforo

TIR Урсула село ерген чекии.



  waldorf  Създадено на 18.11.2024, видяно: 336 пъти. #127777
BIGBUGEX
#include <immintrin.h>
#include <cstdio>

int spcalc( const char *data ) {
	long long idata32 = (long long)data & -32LL;
	unsigned offset = (unsigned)(unsigned long long)data & 31, valid, zerof, sf, pf;
	__m256i *ym_data = (__m256i*)idata32,
		ym_s = _mm256_broadcastb_epi8( *(__m128i*)"s" ),
		ym_p = _mm256_broadcastb_epi8( *(__m128i*)"p" ),
		ym_z = _mm256_xor_si256( ym_s, ym_s ),
		ym_c;
	;
	int res;
	
	valid = -1 << offset;
	ym_c = *ym_data++;
	zerof = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_z ) );
	valid &= zerof ^ (zerof - 1);
	sf = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_s ) );
	pf = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_p ) );
	res = __builtin_popcount( sf & valid ) - __builtin_popcount( pf & valid );
	zerof &= valid;
	
	while( !zerof ) {
		ym_c = *ym_data++;
		zerof = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_z ) );
		valid = zerof ^ ( zerof - 1 );
		sf = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_s ) );
		pf = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_p ) );
		res += __builtin_popcount( sf & valid ) - __builtin_popcount( pf & valid );
	}
	
	return res;
}

int main() {
	printf( "%i\n", spcalc( "eeeeesssssppppp" ) );
	
	return 0;
}

Тва е за х64 с - mavx2. Не съм го мерил за скорост. Би трябвало да изрине всеки арм заради 256 битовите вектори и специфичните инструкции.

ПС: Взех домейн. Остава да напиша форум на С++ като съм по-свободен. Рабина там ще е позволен дивеч.

То точно това беше антипатърна от линка - че сега кода е платформо зависим а ако просто го напишеш да е удобен за векторизиране от компилатора обикновено той се справя по добре отколкото ръчно оптимизиран платформен, че и написан на асемблер код. То тук би помогнал един варнинг с който да заградиш някакъв код и да му кажеш да мрънка ако не успее да го векторизира.

А ако ти се пише форум дали ще е на Ц++ или на нещо друго няма кой знае какво значение. Зависи какви са ти целите - бързо писане, бърз фронд енд, бърз бак енд - или комбинация от всички - и според това вариантите са безброй. Лично за мен избора последните 15 години е сведен до две платформи - има ли какви да е рестрицкии то отивам към чисто Ц, за всички останали неща ползвам жаваскрипт/тайпскрипт и ноде. Целта ми е минимизиране на инвестиция в учене на поредната модна платформа или език или фреймворк докато мога да решавам проблемите по които работя с вече научените неща. Ноде-то го избрах като алтернатива на .нет, че там майкрософт осраха точно тази възвръщаемост на инвестицията - тамън им свикнеш на нещо и те го заменят с нещо ново - било то гуи или веб или дб.



  |  Създадено на 18.11.2024, видяно: 329 пъти. #127782
BIGBUGEX

Би трябвало да изрине всеки арм заради 256 битовите вектори и специфичните инструкции.

Мисля, че ти е ясно, че това с 256 битовите вектори не е задължително да е по-бързо. Например Neoverse V1 има два SVE execution unit-a с 256 битови вектори, докато V2 е с четири юнита със 128 битови вектори. Като тествах (Graviton 3 vs. Grace-Hopper) скоростта беше сравнима (като се коригират различията в честотата).



  BIGBUGEX  Последно редактирано на 18.11.2024 от BIGBUGEX, видяно: 316 пъти. #127783
|

Мисля, че ти е ясно, че това с 256 битовите вектори не е задължително да е по-бързо. Например Neoverse V1 има два SVE execution unit-a с 256 битови вектори, докато V2 е с четири юнита със 128 битови вектори. Като тествах (Graviton 3 vs. Grace-Hopper) скоростта беше сравнима (като се коригират различията в честотата).

Кода ми явно не е много добър. 20 GiB/s на 3700Х закотвен на 3.6 Ghz. А тия батки говорят за 87 GB/s. 3700Х има цял 256 битов изпълнител.

#include <immintrin.h>
#include <cstdio>
#include <ctime>

int spcalc( const char *data ) {
	long long idata32 = (long long)data & -32LL;
	unsigned offset = (unsigned)(unsigned long long)data & 31, valid, zerof, sf, pf;
	__m256i *ym_data = (__m256i*)idata32,
		ym_s = _mm256_broadcastb_epi8( *(__m128i*)"s" ),
		ym_p = _mm256_broadcastb_epi8( *(__m128i*)"p" ),
		ym_z = _mm256_xor_si256( ym_s, ym_s ),
		ym_c;
	;
	int res;
	
	valid = -1 << offset;
	ym_c = *ym_data++;
	zerof = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_z ) );
	valid &= zerof ^ (zerof - 1);
	sf = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_s ) );
	pf = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_p ) );
	res = __builtin_popcount( sf & valid ) - __builtin_popcount( pf & valid );
	zerof &= valid;
	
	while( !zerof ) {
		ym_c = *ym_data++;
		zerof = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_z ) );
		valid = zerof ^ ( zerof - 1 );
		sf = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_s ) );
		pf = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_p ) );
		res += __builtin_popcount( sf & valid ) - __builtin_popcount( pf & valid );
	}
	
	return res;
}

#define G4PCOUNT 1

int main() {
	char data[0x10000];
	unsigned i;
	int r;
	clock_t start, stop;
	
	for( i = 0; i < 0x10000; i += 4 ) {
		data[i + 0] = 'a';
		data[i + 1] = 'p';
		data[i + 2] = 's';
		data[i + 3] = 'z';
	}
	
	data[0xFFFF] = 0;
	start = clock();
	
	for( i = 0; i < G4PCOUNT * 0x10000; i++ ) {
		r = spcalc( data );
	}
	
	stop = clock();
	printf( "%f GiB/s\n", (float)( G4PCOUNT * 4 ) / ( (float)( stop - start ) / CLOCKS_PER_SEC ) );
	
	return 0;
}

Без информация за размера е тегаво иначе. Тия затва се скатават от проверката за край на низа.



  |  Създадено на 18.11.2024, видяно: 304 пъти. #127786
BIGBUGEX

Кода ми явно не е много добър. 20 GiB/s на 3700Х закотвен на 3.6 Ghz. А тия батки говорят за 87 GB/s. 3700Х има цял 256 битов изпълнител. ... Без информация за размера е тегаво иначе. Тия затва се скатават от проверката за край на низа.

Виж как го тестват от гитхъб репозиторито: https://github.com/lunacookies/n-times-faster

На личния ми лаптоп (MacBookAir с М2) ми дава


basic:
                  12 iters
               3.062 ns/b
               0.327 GB/s
table:
                 107 iters
               0.357 ns/b
               2.802 GB/s
table_length:
                 181 iters
               0.211 ns/b
               4.747 GB/s
table_8:
                 259 iters
               0.149 ns/b
               6.697 GB/s
table_16:
                 290 iters
               0.133 ns/b
               7.501 GB/s
neon:
                 905 iters
               0.042 ns/b
              23.704 GB/s
neon_less_reduce:
                1396 iters
               0.027 ns/b
              37.092 GB/s
neon_lsb:
                1447 iters
               0.026 ns/b
              38.439 GB/s
eqsub:
                1884 iters
               0.020 ns/b
              50.875 GB/s
neon_eqsub:
                 844 iters
               0.044 ns/b
              22.813 GB/s
neon_eqsub_unroll:
                1884 iters
               0.019 ns/b
              52.546 GB/s
neon_lsb_unroll:
                3367 iters
               0.011 ns/b
              91.567 GB/s
lsb:
                3390 iters
               0.011 ns/b
              92.157 GB/s


  BIGBUGEX  Последно редактирано на 19.11.2024 от BIGBUGEX, видяно: 284 пъти. #127788
|

Виж как го тестват от гитхъб репозиторито: https://github.com/lunacookies/n-times-faster

На личния ми лаптоп (MacBookAir с М2) ми дава


basic:
                  12 iters
               3.062 ns/b
               0.327 GB/s
table:
                 107 iters
               0.357 ns/b
               2.802 GB/s
table_length:
                 181 iters
               0.211 ns/b
               4.747 GB/s
table_8:
                 259 iters
               0.149 ns/b
               6.697 GB/s
table_16:
                 290 iters
               0.133 ns/b
               7.501 GB/s
neon:
                 905 iters
               0.042 ns/b
              23.704 GB/s
neon_less_reduce:
                1396 iters
               0.027 ns/b
              37.092 GB/s
neon_lsb:
                1447 iters
               0.026 ns/b
              38.439 GB/s
eqsub:
                1884 iters
               0.020 ns/b
              50.875 GB/s
neon_eqsub:
                 844 iters
               0.044 ns/b
              22.813 GB/s
neon_eqsub_unroll:
                1884 iters
               0.019 ns/b
              52.546 GB/s
neon_lsb_unroll:
                3367 iters
               0.011 ns/b
              91.567 GB/s
lsb:
                3390 iters
               0.011 ns/b
              92.157 GB/s

Тия хвърчат в небесата бе. Някои дори предполагат че винаги ще има само два вида знаци в буфера (p и s).

#include <immintrin.h>
#include <cstdio>
#include <ctime>
#include <vector>
#include <algorithm>

int spcalc( const char *data ) {
	long long idata32 = (long long)data & -32LL;
	unsigned offset = (unsigned)(unsigned long long)data & 31, valid, zerof, sf, pf;
	const __m256i *ym_data = (const __m256i*)idata32;
	__m256i ym_s = _mm256_broadcastb_epi8( *(__m128i*)"s" ),
		ym_p = _mm256_broadcastb_epi8( *(__m128i*)"p" ),
		ym_z = _mm256_xor_si256( ym_s, ym_s ),
		ym_c
	;
	int res;
	
	valid = -1 << offset;
	ym_c = *ym_data++;
	zerof = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_z ) );
	valid &= zerof ^ (zerof - 1);
	sf = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_s ) );
	pf = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_p ) );
	res = __builtin_popcount( sf & valid ) - __builtin_popcount( pf & valid );
	zerof &= valid;
	
	while( !zerof ) {
		ym_c = *ym_data++;
		zerof = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_z ) );
		valid = zerof ^ ( zerof - 1 );
		sf = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_s ) );
		pf = (unsigned)_mm256_movemask_epi8( _mm256_cmpeq_epi8( ym_c, ym_p ) );
		res += __builtin_popcount( sf & valid ) - __builtin_popcount( pf & valid );
	}
	
	return res;
}

#define INPSIZE 1000000
#define MBS 128

int main() {
	char data[INPSIZE + 1];
	unsigned i, j, iters;
	int r;
	clock_t start, stop;
	std::vector<double> durs;
	double median;
	
	for( i = 0; i < INPSIZE; i += 4 ) {
		data[i + 0] = 'a';
		data[i + 1] = 'p';
		data[i + 2] = 's';
		data[i + 3] = 'z';
	}
	
	data[INPSIZE] = 0;
	start = clock();
	
	for( i = 0; i < 100; i++ ) {
		r = spcalc( data );
	}
	
	stop = clock();
	iters = (unsigned)( ( CLOCKS_PER_SEC * 5 ) / ( ( stop - start ) / 100 ) / MBS );
	
	for( i = 0; i < iters; i++ ) {
		start = clock();
		
		for( j = 0; j < MBS; j++ ) {
			r = spcalc( data );
		}
		
		stop = clock();
		durs.push_back( (double)( stop - start ) / MBS / CLOCKS_PER_SEC );
	}
	
	std::sort( durs.begin(), durs.end() );
	median = durs[durs.size()/2];
	printf( "iters <%u> %.3f ns/b %.3f GB/s\n", iters, ( median * 1000000000 ) / INPSIZE, (double)INPSIZE / 1000000000 / median );
	
	return 0;
}

iters <868> 0.046 ns/b 21.780 GB/s



  |  Създадено на 19.11.2024, видяно: 280 пъти. #127789
BIGBUGEX

Тия хвърчат в небесата бе. Някои дори предполагат че винаги ще има само два вида знаци в буфера (p и s).

Да, повечето имплементации са напълно нереалистични.

eqsub e може би последната имплементация, която е донякъде реалистична. Проблемът е, че при NEON ако се опиташ да прочетеш вектор, който е извън адресното пространство, програмата ще крашне. Затова и единствения начин да се използват вектори е ако знаеш дължината на стринга. Не знам как е при avx2. Ако не ме домързи може да пробвам как е с SVE, но ще трябва да пускам Graviton3 instance-a си.

Между другото, двете ми mac mini пристигнаха та може да пробвам и със Streaming SVE като науча как да го използвам.

Но като цяло заниманието е безмислено защото задачата е безинтересна.



  BIGBUGEX  Последно редактирано на 19.11.2024 от BIGBUGEX, видяно: 274 пъти. #127790
|

Да, повечето имплементации са напълно нереалистични.

eqsub e може би последната имплементация, която е донякъде реалистична. Проблемът е, че при NEON ако се опиташ да прочетеш вектор, който е извън адресното пространство, програмата ще крашне. Затова и единствения начин да се използват вектори е ако знаеш дължината на стринга. Не знам как е при avx2. Ако не ме домързи може да пробвам как е с SVE, но ще трябва да пускам Graviton3 instance-a си.

Между другото, двете ми mac mini пристигнаха та може да пробвам и със Streaming SVE като науча как да го използвам.

Но като цяло заниманието е безмислено защото задачата е безинтересна.

Тая задача е много сладка за х86 авх2 защото имаме инструкцията vpmovmskb, която взима най-старшият бит от всеки байт на умм регистъра и ги събира точно в 32 битов генерален регистър. В тази задача използвам този трик за да извлека резултата от сравнението с '\0', 's', и 'p', и да сведа решението до игра на 3 маски в генералните регистри. Мисля че няма еквивалент при неон. За SVE не знам. Но е доста приложима.



  Дон Реба  Последно редактирано на 19.11.2024 от Дон Реба, видяно: 267 пъти. #127791

мисля че с тая задача на всички съвременни системи ще измерите единствено скороста на паметта в текущото и настроение, не настройка, а точно настроение, женско. оня ден колежката ми звъни за някви артефакти в някакъв рендер. наложи се да РАБОТЯ, нещо рядко напоследък. натраках някакво решение, нещата се оправиха, но за съжаление скоростта падна. измерих втори път за по-точно - паднала още повече, и то драстично, 3 пъти спрямо кота нула. ушите ми съвсем клепнаха, но ми хрумна да ревъртна и да пусна пак тест на кота нула - показа същата паднала скорост. оказа се че фикса изобщо не забавя (тъй като само смята, но не вдига трансфера на памет), просто съвременните системи са толкова магически че един и същи код се изпълнява в драстично различни времена само заради "разджуркването" на паметта, подчертавам говорим за код който всеки път се стартира като чисто нов процес при нулева заетост на процесора, не просто 3 пъти да тествам в една сесия. така че тия прости тестове без упоменати детайли за борба с ефектите на магията са смешни, меренето на бързодействие днес не е фасулска работа



  Реконструктор  Създадено на 19.11.2024, видяно: 248 пъти. #127794
Дон Реба

мисля че с тая задача на всички съвременни системи ще измерите единствено скороста на паметта в текущото и настроение, не настройка, а точно настроение, женско. оня ден колежката ми звъни за някви артефакти в някакъв рендер. наложи се да РАБОТЯ, нещо рядко напоследък. натраках някакво решение, нещата се оправиха, но за съжаление скоростта падна. измерих втори път за по-точно - паднала още повече, и то драстично, 3 пъти спрямо кота нула. ушите ми съвсем клепнаха, но ми хрумна да ревъртна и да пусна пак тест на кота нула - показа същата паднала скорост. оказа се че фикса изобщо не забавя (тъй като само смята, но не вдига трансфера на памет), просто съвременните системи са толкова магически че един и същи код се изпълнява в драстично различни времена само заради "разджуркването" на паметта, подчертавам говорим за код който всеки път се стартира като чисто нов процес при нулева заетост на процесора, не просто 3 пъти да тествам в една сесия. така че тия прости тестове без упоменати детайли за борба с ефектите на магията са смешни, меренето на бързодействие днес не е фасулска работа

Образовай се



  Дон Реба  Създадено на 19.11.2024, видяно: 247 пъти. #127795

кога ще ти уври главата вместо да постваш линкове, да вадиш тефтера и да водиш записки , като корейски полковник пред прасчо?



  |  Създадено на 19.11.2024, видяно: 225 пъти. #127801
Дон Реба

мисля че с тая задача на всички съвременни системи ще измерите единствено скороста на паметта в текущото и настроение, не настройка, а точно настроение, женско. оня ден колежката ми звъни за някви артефакти в някакъв рендер. наложи се да РАБОТЯ, нещо рядко напоследък. натраках някакво решение, нещата се оправиха, но за съжаление скоростта падна. измерих втори път за по-точно - паднала още повече, и то драстично, 3 пъти спрямо кота нула. ушите ми съвсем клепнаха, но ми хрумна да ревъртна и да пусна пак тест на кота нула - показа същата паднала скорост. оказа се че фикса изобщо не забавя (тъй като само смята, но не вдига трансфера на памет), просто съвременните системи са толкова магически че един и същи код се изпълнява в драстично различни времена само заради "разджуркването" на паметта, подчертавам говорим за код който всеки път се стартира като чисто нов процес при нулева заетост на процесора, не просто 3 пъти да тествам в една сесия. така че тия прости тестове без упоменати детайли за борба с ефектите на магията са смешни, меренето на бързодействие днес не е фасулска работа

Не знам как е с Windows, но не съм забелязал Линукс да страда от "раздьуркане" на паметта. Ако под "скоростта на паметта" имаш предвид конфигурацията и размерите на кешовете, определено си прав при сравнение на различни системи. Тестовия стринг е толкова малък, че се кешира целия не само в L3, но в случая с процесора на Апъл дори и в L2 кеша.

За една и съща система в общи линии определя колко добре работи branch predictor-a и колко добър код генерира компилатора.

П.П. Първия ми наивен опит със SME снощи беше неуспешен. Даде ми Illegal instruction, вероятно компилатора генерира SVE инструкции без smstart/smstop.



  BIGBUGEX  Последно редактирано на 19.11.2024 от BIGBUGEX, видяно: 207 пъти. #127809
Дон Реба

мисля че с тая задача на всички съвременни системи ще измерите единствено скороста на паметта в текущото и настроение, не настройка, а точно настроение, женско. оня ден колежката ми звъни за някви артефакти в някакъв рендер. наложи се да РАБОТЯ, нещо рядко напоследък. натраках някакво решение, нещата се оправиха, но за съжаление скоростта падна. измерих втори път за по-точно - паднала още повече, и то драстично, 3 пъти спрямо кота нула. ушите ми съвсем клепнаха, но ми хрумна да ревъртна и да пусна пак тест на кота нула - показа същата паднала скорост. оказа се че фикса изобщо не забавя (тъй като само смята, но не вдига трансфера на памет), просто съвременните системи са толкова магически че един и същи код се изпълнява в драстично различни времена само заради "разджуркването" на паметта, подчертавам говорим за код който всеки път се стартира като чисто нов процес при нулева заетост на процесора, не просто 3 пъти да тествам в една сесия. така че тия прости тестове без упоменати детайли за борба с ефектите на магията са смешни, меренето на бързодействие днес не е фасулска работа

Аз за това по принцип взимам минималното време, когато всичко е в кеша, един вид идеални обстоятелства. Примерно на 1000 повторения с едни и същи данни.

Дон Реба

кога ще ти уври главата вместо да постваш линкове, да вадиш тефтера и да водиш записки , като корейски полковник пред прасчо?

Всички пишем като се изказваш. За тва Евгени се разочарова толкова като не ти се сбъдна прогнозата.



  Реконструктор  Създадено на 19.11.2024, видяно: 193 пъти. #127816
Дон Реба

кога ще ти уври главата вместо да постваш линкове, да вадиш тефтера и да водиш записки , като корейски полковник пред прасчо?

ти ли си прасчо :-)



  Дон Реба  Създадено на 19.11.2024, видяно: 184 пъти. #127822
BIGBUGEX

За тва Евгени се разочарова толкова като не ти се сбъдна прогнозата.

ще му се реванширам, обещавам!



  BIGBUGEX  Последно редактирано на 21.11.2024 от BIGBUGEX, видяно: 94 пъти. #127983

Пробвах и clang. Определено се справя по-добре от gcc.

eqsub iters <1767> 0.022 ns/b 45.278 GB/s

spcalc iters <801> 0.049 ns/b 20.559 GB/s

Edit: Но не и за моя вариант с тестване за нула.



  johnfound  Създадено на 21.11.2024, видяно: 83 пъти. #127986

Никога не съм обичал играта "Да напишем такъв код на C, че да получим нужният ни машинен код".

Много по-лесно е да си го напиша директно на асемблер. rofl

Но искрено се забавлявам да гледам такова шоу. Нещо като старите комедии с Лоурел и Харди.


0 1 2


neon

  



AsmBB v3.0 (check-in: 7544654b24928b93); SQLite v3.47.0 (check-in: 03a9703e27c44437);
©2016..2024 John Found; Licensed under EUPL; Powered by Assembly language Created with Fresh IDE