【发布时间】:2021-06-17 14:52:53
【问题描述】:
我的代码中有一个循环,我花费了大部分 CPU 时间:
%%write_to_intermediate_head:
; uint64_t count_index = (arr[i] >> (8 * cur_digit)) & (RADIX - 1);
; We will use rsi to hold the digit we're currently examining
mov rsi, [rdx + rdi * 8] ; Load arr[i] into rsi
mov r9, %1 ; Load current digit were sorting on
shl r9, 3 ; Multiply by 8
shrx rsi, rsi, r9
and rsi, 255
; intermediate_arr[--digit_counts[count_index]] = arr[i];
; rdi is the loop counter i
; rsi is the count_index
; rcx is the digit_counts array
; rax is the intermediate_arr
dec qword [rcx + rsi * 8]
mov r9, [rcx + rsi * 8] ; --digit_counts[count_index]
mov rsi, [rdx + rdi * 8] ; arr[i]
mov [rax + r9 * 8], rsi
dec rdi
jnz %%write_to_intermediate_head
变量:digit_counts、arr 和intermediate_arr 都在内存中(堆和bss)。 AMD 分析器显示读取和写入这些内存位置花费了许多周期。有什么办法可以优化吗?
【问题讨论】:
-
用 C 语言编写并使用优化编译器?
标签: assembly x86 x86-64 micro-optimization radix-sort