LINUX.ORG.RU

История изменений

Исправление firkax, (текущая версия) :

Вот его исходник https://github.com/raas/mbw/blob/master/mbw.c там функция worker() делает сам бенчмарк, если убрать измерители времени и прочее несущественное то оно сводится к вот чему:

worker(ullong count, long *a, long *b, , ullong block_size)
numbytes = count*sizeof(long);

dumb:
        for(t=0;t<count;t++) b[t]=a[t];

memcpy:
        memcpy(b, a, numbytes);

mcblock:
        char *src=a, *dst=b;
        for (t=numbytes; t >= block_size; t-=block_size){
            memcpy(dst, src, block_size);
            src+=block_size, dst+=block_size;
        }
        if(t) memcpy(dst, src, t);
Тупой цикл с поэлементным присваиванием может быть быстрее memcpy (у тебя на ddr5), а от нарезания memcpy на куски (безо всякого распараллеливания) меняется его скорость? Я что-то упустил?

Хотя, по поводу первого есть предположение: компилятор мог оптимизировать цикл с учётом всего что можно учесть, в макисмально эффективный для того проца код, а memcpy напримре вызывается какое-то «дефолтное для всех» из предкомпилированной библиотеки и поэтому медленнее. Но так ли это я не знаю.

Исходная версия firkax, :

Вот его исходник https://github.com/raas/mbw/blob/master/mbw.c там функция worker() делает сам бенчмарк, если убрать измерители времени и прочее несущественное то оно сводится к вот чему:

worker(ullong count, long *a, long *b, , ullong block_size)
numbytes = count*sizeof(long);

dumb:
        for(t=0;t<count;t++) b[t]=a[t];

memcpy:
        memcpy(b, a, numbytes);

mcblock:
        char *src=a, *dst=b;
        for (t=numbytes; t >= block_size; t-=block_size){
            memcpy(dst, src, block_size);
            src+=block_size, dst+=block_size;
        }
        if(t) memcpy(dst, src, t);
Тупой цикл с поэлементным присваиванием может быть быстрее memcpy (у тебя на ddr5), а от нарезания memcpy на куски (безо всякого распараллеливания) меняется его скорость? Я что-то упустил?