Оптимизация функции Memcpy

Вот мой алгоритм 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

Как видите, они действительно близки, но я знаю, что могу сделать это быстрее.

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *