불필요한 메모리 참조 제거의 필요성 (combine3combine4)

Inner loop of combine3. data_t = double, OP = *
dest in %rbx, data+i in %rdx, data+length in %rax

.L17:                             loop:
	vmovsd (%rbx), %xmm0              Read product from dest
	vmulsd (%rdx), %xmm0, %xmm0       Multiply product by data[i]
	vmovsd %xmm0, (%rbx)              Store product at dest
	addq $8, %rdx                     Increment data+i
	cmpq %rax, %rdx                   Compare to data+length
	jne .L17                          If !=, goto loop

Code Review

.L17:                         loop:
	vmovsd (%rbx), %xmm0          *dest(메모리)의 누적값을 **읽어** %xmm0로 로드
	vmulsd (%rdx), %xmm0, %xmm0   %xmm0 *= data[i] (현재 원소와 곱, **메모리 -> 연산유닛**)
	vmovsd %xmm0, (%rbx)          갱신된 누적값을 다시 *dest에 저장(**쓰기**)
	addq $8, %rdx                 data+i 포인터를 다음 원소로 이동(double 크기 8바이트)
	cmpq %rax, %rdx               종료 조건 검사: 현재 포인터 vs 끝 포인터
	jne .L17                      같지 않으면 루프 반복

<aside> 💡

combine3는 누적 결과를 매 반복마다 *dest(메모리)에서 읽고,

새 값으로 쓰기 때문에, 반복당 메모리 읽기 2회 + 쓰기 1회가 발생

</aside>

성능적 효과

컴파일러의 자동 변환 불가

<aside> 💡

Memory Aliasing

결론