GCC 4.8 (g++ -O3 -fopenmp foo.cpp) / . N1 4 N2 8.
omp_sum
pushq %rbx
movq %rdi, %rbx
call omp_get_thread_num
movq (%rbx), %rdx
lock addl %eax, (%rdx)
popq %rbx
ret
for(int n=0;n<N;n++) {
omp_sum(NT1);
omp_sum(NT2);
}
.L10
leaq 32(%rsp), %rsi
xorl %ecx, %ecx
movl $4, %edx
movl $_Z7omp_sumi._omp_fn.0, %edi
movl $0, 28(%rsp)
movq %rbx, 32(%rsp)
call GOMP_parallel
leaq 32(%rsp), %rsi
xorl %ecx, %ecx
movl $8, %edx
movl $_Z7omp_sumi._omp_fn.0, %edi
movl $0, 28(%rsp)
movq %rbx, 32(%rsp)
call GOMP_parallel
subl $1, %ebp
jne .L10
for(int n=0;n<N;n++) {
omp_sum(NT2);
omp_sum(NT2);
}
: movl $4, %edx movl $8, %edx. , . GOMP_parallel. GOMP_parallel, , GOMP_parallel , , , . , .
, . ( , N ), .
: 2.41 OpenMP 3.1 " " . GOMP_parallel GCC-4.8 , , , - gomp_resolve_num_threads.