Вот мой алгоритм memcpy, над которым я работал:
static void* memcpy(void* destination, const void* source, size_t size) {
char* dest = (char*)destination;
const char* src = (const char*)source;
//check if length is greater than 16 bytes
if ((size - 16) < 33) {
while (size > 15) {
//wtf even is this, assembly in c++? am i a assembly developer too now?
auto val = _mm_loadu_si128((__m128i*)(src));
_mm_storeu_si128((__m128i*)dest, val);
dest += 16;
src += 16;
size -= 16;
}
}
#ifdef __AVX512__
else if((size - 32) < 65){
while (size > 31) {
//wtf even is this, assembly in c++? am i a assembly developer too now?
auto val = _mm256_loadu_si256((__m256i*)(src));
_mm256_storeu_si256((__m256i*)dest, val);
dest += 32;
src += 32;
size -= 32;
}
}
else if(size > 65 ) {
while (size > 31) {
//wtf even is this, assembly in c++? am i a assembly developer too now?
auto val = _mm512_loadu_si512((__m512i*)(src));
_mm512_storeu_si512((__m512i*)dest, val);
dest += 32;
src += 32;
size -= 32;
}
}
#else
else if (size > 32) {
while (size > 31) {
//wtf even is this, assembly in c++? am i a assembly developer too now?
auto val = _mm256_loadu_si256((__m256i*)(src));
_mm256_storeu_si256((__m256i*)dest, val);
dest += 32;
src += 32;
size -= 32;
}
}
#endif
while (size--) {
*dest++ = *src++;
}
/*if (length > 16) {
src += length - 16;
dest += length - 16;
auto val = _mm_loadu_si128((__m128i*)(src));
_mm_storeu_si128((__m128i*)(dest), val);
}
else {
for (; index < length; ++index) {
*dest++ = *src++;
}
}*/
return destination;
}
Я не думаю, что мой процессор поддерживает AVX 512, поэтому я отключил его сейчас. Я пытаюсь максимально приблизить этот алгоритм к std :: memcpy, но меня пока еще нет. Есть идеи, как я могу сделать это быстрее?
Вот результаты, которые я тестировал с 999 999 итерациями и усреднил результат:
Copying 1361 bytes:
Mine ms: 0.000233
C++ STL ms: 0.000230
Как видите, они действительно близки, но я знаю, что могу сделать это быстрее.