Speedup memcpy
Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті
Всем привет. Мне интересно, насколько можно ускорить memcpy.
Вот код
#include <cstdlib> #include <cstring> #include <iostream> #include <chrono> void memcpy_MG(void* dst, void* src, size_t sz) { uint8_t* __restrict__ dst8 = (uint8_t*) __builtin_assume_aligned(dst, 64); uint8_t* __restrict__ src8 = (uint8_t*) __builtin_assume_aligned(src, 64); for(size_t it = 0; it < sz; it++) { dst8[it] = src8[it]; }; } int main(int argc, char** argv) { (void)argc; (void)argv; std::chrono::duration<double> elapsed; size_t sz = 1920*1080*3; void* src = NULL; posix_memalign(&src, 64, sz); void* dst = NULL; posix_memalign(&dst, 64, sz); auto t0 = std::chrono::high_resolution_clock::now(); memcpy_MG(dst, src, sz); auto t1 = std::chrono::high_resolution_clock::now(); elapsed = (t1 - t0); std::cout << "memcpy_MG time: " << sz/elapsed.count()/1024/1024/1024 << std::endl; t0 = std::chrono::high_resolution_clock::now(); memcpy_MG(dst, src, sz); t1 = std::chrono::high_resolution_clock::now(); elapsed = (t1 - t0); std::cout << "memcpy_MG time: " << sz/elapsed.count()/1024/1024/1024 << std::endl; t0 = std::chrono::high_resolution_clock::now(); for(int i=0; i<10; i++) memcpy_MG(dst, src, sz); t1 = std::chrono::high_resolution_clock::now(); elapsed = (t1 - t0)/10; std::cout << "memcpy_MG time: " << sz/elapsed.count()/1024/1024/1024 << std::endl; t0 = std::chrono::high_resolution_clock::now(); for(int i=0; i<10; i++) memcpy(dst, src, sz); t1 = std::chrono::high_resolution_clock::now(); elapsed = (t1 - t0)/10; std::cout << "memcpy time: " << sz/elapsed.count()/1024/1024/1024 << std::endl; return 0; }
memcpy_MG — Это совет Майка.
Получаются след результаты в гигабайтах в сек:
memcpy_MG time: 1.46773 memcpy_MG time: 5.80593 memcpy_MG time: 7.10735 memcpy time: 6.79568
Юзал Cmakе со след ключами:
set(CMAKE_CXX_FLAGS «-std=c++11 -Wall -Wextra -Wno-unused-local-typedefs -Wno-unused-result-O3 -fno-builtin -msse4»)
По сути вопросы. Можно-ли еще быстрее memcpy сделать?
И можно-ли как-то ускорить именно первый вызов?
AVX2 у меня нет.
А вот такой код
void* s[10]; for(size_t i=0; i<10; ++i) posix_memalign(&s[i], 64, sz); void* d[10]; for(size_t i=0; i<10; ++i) posix_memalign(&d[i], 64, sz); t0 = std::chrono::high_resolution_clock::now(); for(int i=0; i<10; i++) memcpy_MG(d[i], s[i], sz); t1 = std::chrono::high_resolution_clock::now(); elapsed = (t1 - t0)/10; std::cout << "sec memcpy_MG time: " << sz/elapsed.count()/1024/1024/1024 << std::endl;
Дает уже
sec memcpy_MG time: 1.45273
104 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів