我與時下follwoing試驗:混合組裝和Fortran語言加上並行(OpenMP的)
global func_
func_:
push rbp
mov rbp, rsp
mov rax,[rdi]
mov rbx,[rsi]
cmp rbx,1
je done
dec rbx
mov rsi,1
loop1:
shl rsi, 1
dec rbx
jnz loop1
or rax,rsi
mov [rdi],rax
mov rcx,15
mov rax,11
movq xmm1,rcx
movq xmm0, rax
xorpd xmm0, xmm1
movq rax, xmm0
mov [rdi],rax
mov rsp, rbp
pop rbp
ret
done:
or rax,1
mov [rdi],rax
mov rsp, rbp
pop rbp
ret
代碼到目前爲止並沒有真正有意義,我將需要使用XMM [](128按位操作),這彙編代碼應該被編譯成一個對象,並鏈接到Fortran代碼,我會:
! Compile:
!gfortran -c testassembly.F90;
!nasm -f elf64 assembly_func.asm;
!gfortran -o run testassembly.o assembly_func.o;
!./run
a = 10
b = 4
call func(a,b)
到現在爲止一切都非常清楚,現在會發生什麼,如果我對如。 OpenMP平行我的代碼,即:
!$omp do schedule(dynamic,1)
a = 10
b = 4
call func(a,b)
!$omp end do
換句話說,彙編中的寄存器是物理存在嗎?或者他們將以某種方式對OpenMP線程本地化?如果他們分享,競爭條件和類似情況如何?
我希望我已經夠清楚了。
實際上,CPU有更多的寄存器,甚至對於串行程序,名稱也不與核心中的一個不同的物理寄存器重合。 – 2014-11-21 08:24:27