D
@hustbaer: Genau das, was ich haben wollte:
#include <xmmintrin.h>
void* my_memset(void*s,int c,size_t n)
{
register __m128i*p128=(__m128i*)(s);
register __m128i*e128=(__m128i*)(s+n);
register __m128i x128=_mm_setr_epi32
(
(c&0xff)*0x01010101,
(c&0xff)*0x01010101,
(c&0xff)*0x01010101,
(c&0xff)*0x01010101
);
while(p128<=--e128) *e128=x128;
return s;
}
Ist auch 200 Cycles schneller als das normale memset (wobei hier noch etliche Sachen fehlen, das ist mir bewusst). Aber da ich noch keine Erfahrung mit diesen Funktionen habe, wird die Codequalität wohl entsprechend sein ... egal. Ich habe jetzt eine Basis, mit der ich arbeiten kann.
Danke.
EDIT: Kriegt man auch mit AVX2 hin:
#include <immintrin.h>
void* my_memset(void*s,int c,size_t n)
{
register __m256i*p256=(__m256i*)(s);
register __m256i*e256=(__m256i*)(s+n);
register __m256i x256=_mm256_setr_epi32
(
(c&0xff)*0x01010101,
(c&0xff)*0x01010101,
(c&0xff)*0x01010101,
(c&0xff)*0x01010101,
(c&0xff)*0x01010101,
(c&0xff)*0x01010101,
(c&0xff)*0x01010101,
(c&0xff)*0x01010101
);
while(p256<=--e256) *e256=x256;
return s;
}
Benötigt dann sogar nur 750 Cycles statt 1000 (SSE), 1200 (Glibc) oder 1900 (mein naiver Versuch). Was ich jedoch als Verlierer für den gcc verwerte.