LINUX.ORG.RU

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

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

Не хотел терять 30% производительности, а потерял 2x. Просто возьми код из gmp. Только нынче нормальные функции из заголовочных файлов убрали, нужно прям из исходников ассемблер выгрызать.

P.S. У тебя какой-то странный ассемблер, там всё местами поменяно и сигилов нет.

; void naive_func(uint64_t *dst, uint64_t *src, size_t offset);

.global naive_func
.type naive_func, @function
naive_func:
movq %rdx, %rcx

1:
.align 32
movq (%rsi,%rcx,8), %rax
sbbq %rax, (%rdi,%rcx,8)
incq %rcx
jnz 1b

sbbq $0, (%rdi)

retq
#include <stdint.h>
#include <stddef.h>
#include <stdio.h>

#define N 64

void naive_func(uint64_t *dst, const uint64_t *src, size_t offset);

uint64_t __gmpn_sub_n(uint64_t *rp, const uint64_t *s1p, const uint64_t *s2p, int64_t n);

int main()
{
    static uint64_t a[N + 2];
    static uint64_t b[N + 2];

    for (int i = 0; i < 10 * 1000 * 1000; ++i) {
#if NAIVE_FUNC
        naive_func(a + N + 1, b + N + 1, -N);
#else
        __gmpn_sub_n(a + 1, a + 1, b + 1, N);
#endif
    }
}

У меня 0.18s против 0.36s.

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

Не хотел терять 30% производительности, а потерял 2x. Просто возьми код из gmp. Только нынче нормальные функции из заголовочных файлов убрали, нужно прям из исходников ассемблер выгрызать.

; void naive_func(uint64_t *dst, uint64_t *src, size_t offset);

.global naive_func
.type naive_func, @function
naive_func:
movq %rdx, %rcx

1:
.align 32
movq (%rsi,%rcx,8), %rax
sbbq %rax, (%rdi,%rcx,8)
incq %rcx
jnz 1b

sbbq $0, (%rdi)

retq
#include <stdint.h>
#include <stddef.h>
#include <stdio.h>

#define N 64

void naive_func(uint64_t *dst, const uint64_t *src, size_t offset);

uint64_t __gmpn_sub_n(uint64_t *rp, const uint64_t *s1p, const uint64_t *s2p, int64_t n);

int main()
{
    static uint64_t a[N + 2];
    static uint64_t b[N + 2];

    for (int i = 0; i < 10 * 1000 * 1000; ++i) {
#if NAIVE_FUNC
        naive_func(a + N + 1, b + N + 1, -N);
#else
        __gmpn_sub_n(a + 1, a + 1, b + 1, N);
#endif
    }
}

У меня 0.18s против 0.36s.