2023.10.26
風邪をひいて、昨日はダウンしてしまいました。
今日も体調悪く働いています。
まず前半は、プログラムの話。
ここ最近、勉強しはじめたAVXの話。
■AVX2の特徴
- 256ビット以上のベクトルをシングルインストラクションマルチプルデータ (SIMD) で実行できる
- 演算効率が2倍に高速化される
- 多くの部分で処理が高速化され、低負荷になる 参考サイト: 命令一覧 https://www.officedaytime.com/tips/simd.html
マニュアル http://www.intel.co.jp/content/www/jp/ja/processors/architectures-software-developer-manuals.html
■実際にやってみた
サンプルコードを作ってみました。
#include <stdio.h>
#include <immintrin.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#define MAX (10000000) /* 1000万 */
int main(int argc, char **argv)
{
/* ベクトルの要素数を指定 */
const int32_t n = 8;
int32_t i;
__m256i a;
__m256i b;
__m256i result;
for (i=0; i < MAX; i++) {
/* ベクトルAとベクトルBを初期化 */
a = _mm256_set_epi32(1, 2, 3, 4, 5, 6, 7, 8);
b = _mm256_set_epi32(8, 7, 6, 5, 4, 3, 2, 1);
/* ベクトルAとベクトルBを加算 */
result = _mm256_add_epi32(a, b);
}
/* 結果を表示 */
int* res = (int*)&result;
printf("ベクトルA + ベクトルB = [%d, %d, %d, %d, %d, %d, %d, %d]\n", res[7], res[6], res[5], res[4], res[3], res[2], res[1], res[0]);
exit(0);
}サンプルコードは、AVXのさわりということでベクトル計算の加算で確認
使ってのは、以下の関数
_mm256_set_epi32
_mm256_add_epi32
32bitの整数値の加算のコードを作成
実行結果自体は、単純なもの
raichi@lena:~/works/R-MIX/TP/tp113 % time ./a.out
ベクトルA + ベクトルB = [9, 9, 9, 9, 9, 9, 9, 9]
0.000u 0.008s 0:00.00 0.0% 0+0k 0+0io 0pf+0wまぁ、1,000万回しても軽く動きます。
そして、実際にCからアセンブラにして実際に使用されている命令がどうなっているか確認
.file "a.c"
.text
.section .rodata
.align 8
.LC0:
.string "\343\203\231\343\202\257\343\203\210\343\203\253A + \343\203\231\343\202\257\343\203\210\343\203\253B = [%d, %d, %d, %d, %d, %d, %d, %d]\n"
.text
.globl main
.type main, @function
main:
.LFB4201:
.cfi_startproc
leaq 8(%rsp), %r10
.cfi_def_cfa 10, 0
andq $-32, %rsp
pushq -8(%r10)
pushq %rbp
movq %rsp, %rbp
.cfi_escape 0x10,0x6,0x2,0x76,0
pushq %r10
.cfi_escape 0xf,0x3,0x76,0x78,0x6
subq $296, %rsp
movl %edi, -276(%rbp)
movq %rsi, -288(%rbp)
movl $8, -24(%rbp)
movl $0, -20(%rbp)
jmp .L2
.L6:
movl $1, -212(%rbp)
movl $2, -216(%rbp)
movl $3, -220(%rbp)
movl $4, -224(%rbp)
movl $5, -228(%rbp)
movl $6, -232(%rbp)
movl $7, -236(%rbp)
movl $8, -240(%rbp)
movl -212(%rbp), %eax
movl -216(%rbp), %edx
vmovd %edx, %xmm3
vpinsrd $1, %eax, %xmm3, %xmm1
movl -220(%rbp), %eax
movl -224(%rbp), %edx
vmovd %edx, %xmm4
vpinsrd $1, %eax, %xmm4, %xmm0
vpunpcklqdq %xmm1, %xmm0, %xmm1
movl -228(%rbp), %eax
movl -232(%rbp), %edx
vmovd %edx, %xmm5
vpinsrd $1, %eax, %xmm5, %xmm2
movl -236(%rbp), %eax
movl -240(%rbp), %edx
vmovd %edx, %xmm6
vpinsrd $1, %eax, %xmm6, %xmm0
vpunpcklqdq %xmm2, %xmm0, %xmm0
vinserti128 $0x1, %xmm1, %ymm0, %ymm0
vmovdqa %ymm0, -80(%rbp)
movl $8, -180(%rbp)
movl $7, -184(%rbp)
movl $6, -188(%rbp)
movl $5, -192(%rbp)
movl $4, -196(%rbp)
movl $3, -200(%rbp)
movl $2, -204(%rbp)
movl $1, -208(%rbp)
movl -180(%rbp), %eax
movl -184(%rbp), %edx
vmovd %edx, %xmm7
vpinsrd $1, %eax, %xmm7, %xmm1
movl -188(%rbp), %eax
movl -192(%rbp), %edx
vmovd %edx, %xmm3
vpinsrd $1, %eax, %xmm3, %xmm0
vpunpcklqdq %xmm1, %xmm0, %xmm1
movl -196(%rbp), %eax
movl -200(%rbp), %edx
vmovd %edx, %xmm4
vpinsrd $1, %eax, %xmm4, %xmm2
movl -204(%rbp), %eax
movl -208(%rbp), %edx
vmovd %edx, %xmm5
vpinsrd $1, %eax, %xmm5, %xmm0
vpunpcklqdq %xmm2, %xmm0, %xmm0
vinserti128 $0x1, %xmm1, %ymm0, %ymm0
vmovdqa %ymm0, -112(%rbp)
vmovdqa -80(%rbp), %ymm0
vmovdqa %ymm0, -144(%rbp)
vmovdqa -112(%rbp), %ymm0
vmovdqa %ymm0, -176(%rbp)
vmovdqa -144(%rbp), %ymm1
vmovdqa -176(%rbp), %ymm0
vpaddd %ymm0, %ymm1, %ymm0
nop
vmovdqa %ymm0, -272(%rbp)
addl $1, -20(%rbp)
.L2:
cmpl $9999999, -20(%rbp)
jle .L6
leaq -272(%rbp), %rax
movq %rax, -32(%rbp)
movq -32(%rbp), %rax
movl (%rax), %r8d
movq -32(%rbp), %rax
addq $4, %rax
movl (%rax), %edi
movq -32(%rbp), %rax
addq $8, %rax
movl (%rax), %esi
movq -32(%rbp), %rax
addq $12, %rax
movl (%rax), %r9d
movq -32(%rbp), %rax
addq $16, %rax
movl (%rax), %r10d
movq -32(%rbp), %rax
addq $20, %rax
movl (%rax), %ecx
movq -32(%rbp), %rax
addq $24, %rax
movl (%rax), %edx
movq -32(%rbp), %rax
addq $28, %rax
movl (%rax), %eax
subq $8, %rsp
pushq %r8
pushq %rdi
pushq %rsi
movl %r10d, %r8d
movl %eax, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
addq $32, %rsp
movl $0, %edi
call exit
.cfi_endproc
.LFE4201:
.size main, .-main
.ident "GCC: (FreeBSD Ports Collection) 11.3.0"
.section .note.GNU-stack,"",@progbitsvmovd
vpinsrd
vpunpcklqdq
vinserti128
32bitの整数していでしたが、64bitのfloatを使用している?
ちなみに、gcc11を使用してコンパイルをかけています。
さて、この結果を、師匠の師匠(みたいな人)にこの結果の話をしたところ、「a.outも確認してみたら?」っとのことでったので、
a.outを逆アセンブラしてみました。
./a.out: ファイル形式 elf64-x86-64-freebsd
セクション .init の逆アセンブル:
00000000004004a8 <_init>:
4004a8: 48 83 ec 08 sub $0x8,%rsp
4004ac: e8 df 03 00 00 call 400890 <frame_dummy>
4004b1: e8 3a 04 00 00 call 4008f0 <__do_global_ctors_aux>
4004b6: 48 83 c4 08 add $0x8,%rsp
4004ba: c3 ret
セクション .plt の逆アセンブル:
00000000004004c0 <atexit@plt-0x10>:
4004c0: ff 35 12 17 00 00 push 0x1712(%rip) # 401bd8 <_GLOBAL_OFFSET_TABLE_+0x8>
4004c6: ff 25 14 17 00 00 jmp *0x1714(%rip) # 401be0 <_GLOBAL_OFFSET_TABLE_+0x10>
4004cc: 0f 1f 40 00 nopl 0x0(%rax)
00000000004004d0 <atexit@plt>:
4004d0: ff 25 12 17 00 00 jmp *0x1712(%rip) # 401be8 <atexit@FBSD_1.0>
4004d6: 68 00 00 00 00 push $0x0
4004db: e9 e0 ff ff ff jmp 4004c0 <_init+0x18>
00000000004004e0 <printf@plt>:
4004e0: ff 25 0a 17 00 00 jmp *0x170a(%rip) # 401bf0 <printf@FBSD_1.0>
4004e6: 68 01 00 00 00 push $0x1
4004eb: e9 d0 ff ff ff jmp 4004c0 <_init+0x18>
00000000004004f0 <exit@plt>:
4004f0: ff 25 02 17 00 00 jmp *0x1702(%rip) # 401bf8 <exit@FBSD_1.0>
4004f6: 68 02 00 00 00 push $0x2
4004fb: e9 c0 ff ff ff jmp 4004c0 <_init+0x18>
0000000000400500 <_init_tls@plt>:
400500: ff 25 fa 16 00 00 jmp *0x16fa(%rip) # 401c00 <_init_tls@FBSD_1.0>
400506: 68 03 00 00 00 push $0x3
40050b: e9 b0 ff ff ff jmp 4004c0 <_init+0x18>
セクション .text の逆アセンブル:
0000000000400510 <_start>:
400510: 55 push %rbp
400511: 48 89 e5 mov %rsp,%rbp
400514: 41 57 push %r15
400516: 41 56 push %r14
400518: 41 55 push %r13
40051a: 41 54 push %r12
40051c: 53 push %rbx
40051d: 50 push %rax
40051e: 49 89 fe mov %rdi,%r14
400521: 4c 8b 3f mov (%rdi),%r15
400524: 49 63 c7 movslq %r15d,%rax
400527: 48 8d 1c c7 lea (%rdi,%rax,8),%rbx
40052b: 48 83 c3 10 add $0x10,%rbx
40052f: 48 83 3d e1 16 00 00 cmpq $0x0,0x16e1(%rip) # 401c18 <environ>
400536: 00
400537: 75 07 jne 400540 <_start+0x30>
400539: 48 89 1d d8 16 00 00 mov %rbx,0x16d8(%rip) # 401c18 <environ>
400540: 49 83 c6 08 add $0x8,%r14
400544: 45 85 ff test %r15d,%r15d
400547: 7e 2f jle 400578 <_start+0x68>
400549: 49 8b 06 mov (%r14),%rax
40054c: 48 85 c0 test %rax,%rax
40054f: 74 27 je 400578 <_start+0x68>
400551: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1)
400558: 00 00 00
40055b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
400560: 48 89 05 a1 16 00 00 mov %rax,0x16a1(%rip) # 401c08 <__progname>
400567: 48 83 c0 01 add $0x1,%rax
40056b: 0f b6 48 ff movzbl -0x1(%rax),%ecx
40056f: 80 f9 2f cmp $0x2f,%cl
400572: 74 ec je 400560 <_start+0x50>
400574: 84 c9 test %cl,%cl
400576: 75 ef jne 400567 <_start+0x57>
400578: b8 30 1a 40 00 mov $0x401a30,%eax
40057d: 48 85 c0 test %rax,%rax
400580: 74 0a je 40058c <_start+0x7c>
400582: 48 89 f7 mov %rsi,%rdi
400585: e8 46 ff ff ff call 4004d0 <atexit@plt>
40058a: eb 68 jmp 4005f4 <_start+0xe4>
40058c: 48 89 5d d0 mov %rbx,-0x30(%rbp)
400590: 41 bd a8 04 40 00 mov $0x4004a8,%r13d
400596: eb 0c jmp 4005a4 <_start+0x94>
400598: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
40059f: 00
4005a0: 49 83 c5 18 add $0x18,%r13
4005a4: 49 81 fd a8 04 40 00 cmp $0x4004a8,%r13
4005ab: 73 3e jae 4005eb <_start+0xdb>
4005ad: b8 01 00 00 00 mov $0x1,%eax
4005b2: 0f a2 cpuid
4005b4: 89 d7 mov %edx,%edi
4005b6: 89 ce mov %ecx,%esi
4005b8: 31 c0 xor %eax,%eax
4005ba: 0f a2 cpuid
4005bc: bb 00 00 00 00 mov $0x0,%ebx
4005c1: b9 00 00 00 00 mov $0x0,%ecx
4005c6: 83 f8 07 cmp $0x7,%eax
4005c9: 72 09 jb 4005d4 <_start+0xc4>
4005cb: 31 c9 xor %ecx,%ecx
4005cd: b8 07 00 00 00 mov $0x7,%eax
4005d2: 0f a2 cpuid
4005d4: 41 83 7d 08 25 cmpl $0x25,0x8(%r13)
4005d9: 75 c5 jne 4005a0 <_start+0x90>
4005db: 4d 8b 65 00 mov 0x0(%r13),%r12
4005df: 89 da mov %ebx,%edx
4005e1: 41 ff 55 10 call *0x10(%r13)
4005e5: 49 89 04 24 mov %rax,(%r12)
4005e9: eb b5 jmp 4005a0 <_start+0x90>
4005eb: e8 10 ff ff ff call 400500 <_init_tls@plt>
4005f0: 48 8b 5d d0 mov -0x30(%rbp),%rbx
4005f4: 44 89 ff mov %r15d,%edi
4005f7: 4c 89 f6 mov %r14,%rsi
4005fa: 48 89 da mov %rbx,%rdx
4005fd: e8 1e 00 00 00 call 400620 <handle_static_init>
400602: 44 89 ff mov %r15d,%edi
400605: 4c 89 f6 mov %r14,%rsi
400608: 48 89 da mov %rbx,%rdx
40060b: e8 85 02 00 00 call 400895 <main>
400610: 89 c7 mov %eax,%edi
400612: e8 d9 fe ff ff call 4004f0 <exit@plt>
400617: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1)
40061e: 00 00
0000000000400620 <handle_static_init>:
400620: 55 push %rbp
400621: 48 89 e5 mov %rsp,%rbp
400624: 41 57 push %r15
400626: 41 56 push %r14
400628: 41 55 push %r13
40062a: 41 54 push %r12
40062c: 53 push %rbx
40062d: 50 push %rax
40062e: b8 30 1a 40 00 mov $0x401a30,%eax
400633: 48 85 c0 test %rax,%rax
400636: 0f 85 e8 00 00 00 jne 400724 <handle_static_init+0x104>
40063c: 49 89 d6 mov %rdx,%r14
40063f: 49 89 f7 mov %rsi,%r15
400642: 41 89 fc mov %edi,%r12d
400645: bf 40 07 40 00 mov $0x400740,%edi
40064a: e8 81 fe ff ff call 4004d0 <atexit@plt>
40064f: b8 10 1a 40 00 mov $0x401a10,%eax
400654: b9 10 1a 40 00 mov $0x401a10,%ecx
400659: 48 29 c1 sub %rax,%rcx
40065c: 48 8d 41 07 lea 0x7(%rcx),%rax
400660: 48 85 c9 test %rcx,%rcx
400663: 48 89 ca mov %rcx,%rdx
400666: 48 0f 48 d0 cmovs %rax,%rdx
40066a: 48 c1 fa 03 sar $0x3,%rdx
40066e: 74 44 je 4006b4 <handle_static_init+0x94>
400670: 48 85 c9 test %rcx,%rcx
400673: 48 0f 49 c1 cmovns %rcx,%rax
400677: 48 c1 f8 03 sar $0x3,%rax
40067b: 48 83 f8 02 cmp $0x2,%rax
40067f: 41 bd 01 00 00 00 mov $0x1,%r13d
400685: 4c 0f 43 e8 cmovae %rax,%r13
400689: 31 db xor %ebx,%ebx
40068b: eb 0c jmp 400699 <handle_static_init+0x79>
40068d: 0f 1f 00 nopl (%rax)
400690: 48 83 c3 01 add $0x1,%rbx
400694: 49 39 dd cmp %rbx,%r13
400697: 74 1b je 4006b4 <handle_static_init+0x94>
400699: 48 8b 04 dd 10 1a 40 mov 0x401a10(,%rbx,8),%rax
4006a0: 00
4006a1: 48 83 f8 02 cmp $0x2,%rax
4006a5: 72 e9 jb 400690 <handle_static_init+0x70>
4006a7: 44 89 e7 mov %r12d,%edi
4006aa: 4c 89 fe mov %r15,%rsi
4006ad: 4c 89 f2 mov %r14,%rdx
4006b0: ff d0 call *%rax
4006b2: eb dc jmp 400690 <handle_static_init+0x70>
4006b4: e8 ef fd ff ff call 4004a8 <_init>
4006b9: b8 10 1a 40 00 mov $0x401a10,%eax
4006be: b9 10 1a 40 00 mov $0x401a10,%ecx
4006c3: 48 29 c1 sub %rax,%rcx
4006c6: 48 8d 41 07 lea 0x7(%rcx),%rax
4006ca: 48 85 c9 test %rcx,%rcx
4006cd: 48 89 ca mov %rcx,%rdx
4006d0: 48 0f 48 d0 cmovs %rax,%rdx
4006d4: 48 c1 fa 03 sar $0x3,%rdx
4006d8: 74 4a je 400724 <handle_static_init+0x104>
4006da: 48 85 c9 test %rcx,%rcx
4006dd: 48 0f 49 c1 cmovns %rcx,%rax
4006e1: 48 c1 f8 03 sar $0x3,%rax
4006e5: 48 83 f8 02 cmp $0x2,%rax
4006e9: 41 bd 01 00 00 00 mov $0x1,%r13d
4006ef: 4c 0f 43 e8 cmovae %rax,%r13
4006f3: 31 db xor %ebx,%ebx
4006f5: eb 12 jmp 400709 <handle_static_init+0xe9>
4006f7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1)
4006fe: 00 00
400700: 48 83 c3 01 add $0x1,%rbx
400704: 49 39 dd cmp %rbx,%r13
400707: 74 1b je 400724 <handle_static_init+0x104>
400709: 48 8b 04 dd 10 1a 40 mov 0x401a10(,%rbx,8),%rax
400710: 00
400711: 48 83 f8 02 cmp $0x2,%rax
400715: 72 e9 jb 400700 <handle_static_init+0xe0>
400717: 44 89 e7 mov %r12d,%edi
40071a: 4c 89 fe mov %r15,%rsi
40071d: 4c 89 f2 mov %r14,%rdx
400720: ff d0 call *%rax
400722: eb dc jmp 400700 <handle_static_init+0xe0>
400724: 48 83 c4 08 add $0x8,%rsp
400728: 5b pop %rbx
400729: 41 5c pop %r12
40072b: 41 5d pop %r13
40072d: 41 5e pop %r14
40072f: 41 5f pop %r15
400731: 5d pop %rbp
400732: c3 ret
400733: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1)
40073a: 00 00 00
40073d: 0f 1f 00 nopl (%rax)
0000000000400740 <finalizer>:
400740: 55 push %rbp
400741: 48 89 e5 mov %rsp,%rbp
400744: 53 push %rbx
400745: 50 push %rax
400746: b9 10 1a 40 00 mov $0x401a10,%ecx
40074b: b8 10 1a 40 00 mov $0x401a10,%eax
400750: 48 29 c8 sub %rcx,%rax
400753: 48 8d 58 07 lea 0x7(%rax),%rbx
400757: 48 85 c0 test %rax,%rax
40075a: 48 89 c1 mov %rax,%rcx
40075d: 48 0f 48 cb cmovs %rbx,%rcx
400761: 48 c1 f9 03 sar $0x3,%rcx
400765: 75 0b jne 400772 <finalizer+0x32>
400767: 48 83 c4 08 add $0x8,%rsp
40076b: 5b pop %rbx
40076c: 5d pop %rbp
40076d: e9 c2 01 00 00 jmp 400934 <_fini>
400772: 48 85 c0 test %rax,%rax
400775: 48 0f 49 d8 cmovns %rax,%rbx
400779: 48 c1 fb 03 sar $0x3,%rbx
40077d: eb 06 jmp 400785 <finalizer+0x45>
40077f: 90 nop
400780: 48 85 db test %rbx,%rbx
400783: 74 e2 je 400767 <finalizer+0x27>
400785: 48 8b 04 dd 08 1a 40 mov 0x401a08(,%rbx,8),%rax
40078c: 00
40078d: 48 83 c3 ff add $0xffffffffffffffff,%rbx
400791: 48 83 f8 02 cmp $0x2,%rax
400795: 72 e9 jb 400780 <finalizer+0x40>
400797: ff d0 call *%rax
400799: eb e5 jmp 400780 <finalizer+0x40>
40079b: cc int3
40079c: 0f 1f 40 00 nopl 0x0(%rax)
00000000004007a0 <deregister_tm_clones>:
4007a0: 48 8d 3d 71 14 00 00 lea 0x1471(%rip),%rdi # 401c18 <environ>
4007a7: 48 8d 05 6a 14 00 00 lea 0x146a(%rip),%rax # 401c18 <environ>
4007ae: 48 39 f8 cmp %rdi,%rax
4007b1: 74 15 je 4007c8 <deregister_tm_clones+0x28>
4007b3: 48 8b 05 06 14 00 00 mov 0x1406(%rip),%rax # 401bc0 <_ITM_deregisterTMCloneTable@Base>
4007ba: 48 85 c0 test %rax,%rax
4007bd: 74 09 je 4007c8 <deregister_tm_clones+0x28>
4007bf: ff e0 jmp *%rax
4007c1: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
4007c8: c3 ret
4007c9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
00000000004007d0 <register_tm_clones>:
4007d0: 48 8d 3d 41 14 00 00 lea 0x1441(%rip),%rdi # 401c18 <environ>
4007d7: 48 8d 35 3a 14 00 00 lea 0x143a(%rip),%rsi # 401c18 <environ>
4007de: 48 29 fe sub %rdi,%rsi
4007e1: 48 89 f0 mov %rsi,%rax
4007e4: 48 c1 ee 3f shr $0x3f,%rsi
4007e8: 48 c1 f8 03 sar $0x3,%rax
4007ec: 48 01 c6 add %rax,%rsi
4007ef: 48 d1 fe sar %rsi
4007f2: 74 14 je 400808 <register_tm_clones+0x38>
4007f4: 48 8b 05 cd 13 00 00 mov 0x13cd(%rip),%rax # 401bc8 <_ITM_registerTMCloneTable@Base>
4007fb: 48 85 c0 test %rax,%rax
4007fe: 74 08 je 400808 <register_tm_clones+0x38>
400800: ff e0 jmp *%rax
400802: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)
400808: c3 ret
400809: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
0000000000400810 <__do_global_dtors_aux>:
400810: 80 3d 09 14 00 00 00 cmpb $0x0,0x1409(%rip) # 401c20 <completed.1>
400817: 75 67 jne 400880 <__do_global_dtors_aux+0x70>
400819: 55 push %rbp
40081a: 48 8d 05 ff 11 00 00 lea 0x11ff(%rip),%rax # 401a20 <__DTOR_LIST__>
400821: 48 89 e5 mov %rsp,%rbp
400824: 41 54 push %r12
400826: 49 89 c4 mov %rax,%r12
400829: 53 push %rbx
40082a: 48 8d 1d f7 11 00 00 lea 0x11f7(%rip),%rbx # 401a28 <__DTOR_END__>
400831: 48 29 c3 sub %rax,%rbx
400834: 48 8b 05 ed 13 00 00 mov 0x13ed(%rip),%rax # 401c28 <dtor_idx.0>
40083b: 48 c1 fb 03 sar $0x3,%rbx
40083f: 48 83 eb 01 sub $0x1,%rbx
400843: 48 39 d8 cmp %rbx,%rax
400846: 73 23 jae 40086b <__do_global_dtors_aux+0x5b>
400848: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
40084f: 00
400850: 48 83 c0 01 add $0x1,%rax
400854: 48 89 05 cd 13 00 00 mov %rax,0x13cd(%rip) # 401c28 <dtor_idx.0>
40085b: 41 ff 14 c4 call *(%r12,%rax,8)
40085f: 48 8b 05 c2 13 00 00 mov 0x13c2(%rip),%rax # 401c28 <dtor_idx.0>
400866: 48 39 d8 cmp %rbx,%rax
400869: 72 e5 jb 400850 <__do_global_dtors_aux+0x40>
40086b: e8 30 ff ff ff call 4007a0 <deregister_tm_clones>
400870: 5b pop %rbx
400871: 41 5c pop %r12
400873: c6 05 a6 13 00 00 01 movb $0x1,0x13a6(%rip) # 401c20 <completed.1>
40087a: 5d pop %rbp
40087b: c3 ret
40087c: 0f 1f 40 00 nopl 0x0(%rax)
400880: c3 ret
400881: 66 66 2e 0f 1f 84 00 data16 cs nopw 0x0(%rax,%rax,1)
400888: 00 00 00 00
40088c: 0f 1f 40 00 nopl 0x0(%rax)
0000000000400890 <frame_dummy>:
400890: e9 3b ff ff ff jmp 4007d0 <register_tm_clones>
0000000000400895 <main>:
400895: 55 push %rbp
400896: 48 89 e5 mov %rsp,%rbp
400899: b8 80 96 98 00 mov $0x989680,%eax
40089e: 83 e8 01 sub $0x1,%eax
4008a1: 75 fb jne 40089e <main+0x9>
4008a3: 48 83 ec 08 sub $0x8,%rsp
4008a7: 6a 09 push $0x9
4008a9: 6a 09 push $0x9
4008ab: 6a 09 push $0x9
4008ad: 41 b9 09 00 00 00 mov $0x9,%r9d
4008b3: 41 b8 09 00 00 00 mov $0x9,%r8d
4008b9: b9 09 00 00 00 mov $0x9,%ecx
4008be: ba 09 00 00 00 mov $0x9,%edx
4008c3: be 09 00 00 00 mov $0x9,%esi
4008c8: bf 50 09 40 00 mov $0x400950,%edi
4008cd: b8 00 00 00 00 mov $0x0,%eax
4008d2: e8 09 fc ff ff call 4004e0 <printf@plt>
4008d7: 48 83 c4 20 add $0x20,%rsp
4008db: bf 00 00 00 00 mov $0x0,%edi
4008e0: e8 0b fc ff ff call 4004f0 <exit@plt>
4008e5: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1)
4008ec: 00 00 00
4008ef: 90 nop
00000000004008f0 <__do_global_ctors_aux>:
4008f0: 48 8b 05 19 11 00 00 mov 0x1119(%rip),%rax # 401a10 <__CTOR_LIST__>
4008f7: 48 83 f8 ff cmp $0xffffffffffffffff,%rax
4008fb: 74 33 je 400930 <__do_global_ctors_aux+0x40>
4008fd: 55 push %rbp
4008fe: 48 89 e5 mov %rsp,%rbp
400901: 53 push %rbx
400902: 48 8d 1d 07 11 00 00 lea 0x1107(%rip),%rbx # 401a10 <__CTOR_LIST__>
400909: 48 83 ec 08 sub $0x8,%rsp
40090d: 0f 1f 00 nopl (%rax)
400910: ff d0 call *%rax
400912: 48 8b 43 f8 mov -0x8(%rbx),%rax
400916: 48 83 eb 08 sub $0x8,%rbx
40091a: 48 83 f8 ff cmp $0xffffffffffffffff,%rax
40091e: 75 f0 jne 400910 <__do_global_ctors_aux+0x20>
400920: 48 8b 5d f8 mov -0x8(%rbp),%rbx
400924: c9 leave
400925: c3 ret
400926: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1)
40092d: 00 00 00
400930: c3 ret
400931: 0f 1f 00 nopl (%rax)
セクション .fini の逆アセンブル:
0000000000400934 <_fini>:
400934: 48 83 ec 08 sub $0x8,%rsp
400938: e8 d3 fe ff ff call 400810 <__do_global_dtors_aux>
40093d: 48 83 c4 08 add $0x8,%rsp
400941: c3 retx87演算?
AVXはどこに?
逆アセンブルの結果をみるとCからアセンブラに変えた命令内容と違うぞ?
これを、リアルの話で例えると、
巨乳だと思って付き合っていた人が、外部(ブラジャ)の力を使い実は、巨乳ではなかった。
ということになります。
確かに、そこに(機能として)オパーイはあるけど、私の(求めていた)オパーイがないわけです。
結果は、一緒なのですが、これはアカンっと思います。
離婚問題勃発になるわけです。
分かった時は、今まで書いたコードが、自分の意図してないものになっていたのではと、アキバでホッピー飲みながらクダを巻きちらし、夜中には嘔吐するという精神的ショックを受けたわけです。
・・・さて、1日色々と考え、(gccと)対話したところ、これは私とgccとのすれ違いであったことがわかりました。
端的に言うと、以下の内容がわかるかった
- a.outでAVXで利用していない理由は、最適化オプション(-02)を利用していたから
- サンプルコードで利用している値が、固定値だったから
ということです。
これで、離婚は解消されました。
まだ、clangに完全乗り換えではなく、gccも利用できます。
実際にそれぞれ逆アセンブルした内容を掲示します。
まずは、サンプルコードを改造
#include <stdio.h>
#include <immintrin.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#define MAX (10000000) /* 1000万 */
int main(int argc, char **argv)
{
/* ベクトルの要素数を指定 */
const int32_t n = 8;
int32_t i;
__m256i a;
__m256i b;
__m256i result;
for (i=0; i < MAX; i++) {
/* ベクトルAとベクトルBを初期化 */
a = _mm256_set_epi32((1+rand()), (2+rand()), (3+rand()), (4+rand()), (5+rand()), (6+rand()), (7+rand()), (8+rand()));
b = _mm256_set_epi32((8+rand()), (7+rand()), (6+rand()), (5+rand()), (4+rand()), (3+rand()), (2+rand()), (1+rand()));
/* ベクトルAとベクトルBを加算 */
result = _mm256_add_epi32(a, b);
}
/* 結果を表示 */
int* res = (int*)&result;
printf("ベクトルA + ベクトルB = [%d, %d, %d, %d, %d, %d, %d, %d]\n", res[7], res[6], res[5], res[4], res[3], res[2], res[1], res[0]);
exit(0);
}改造の点は、2つ
- 計算する値を、固定値ではなくrand()を利用(元々演算結果が、あっているかどうかを確認していたので、今回は検証せず単純にコードと速度を確認)
- 最適化オプション(-02)を外す
上記の結果したところ、面白い結果になりました。
./a.out: ファイル形式 elf64-x86-64-freebsd
セクション .init の逆アセンブル:
00000000004004a8 <_init>:
4004a8: 48 83 ec 08 sub $0x8,%rsp
4004ac: e8 df 03 00 00 call 400890 <frame_dummy>
4004b1: e8 5a 06 00 00 call 400b10 <__do_global_ctors_aux>
4004b6: 48 83 c4 08 add $0x8,%rsp
4004ba: c3 ret
セクション .plt の逆アセンブル:
00000000004004c0 <atexit@plt-0x10>:
4004c0: ff 35 3a 19 00 00 push 0x193a(%rip) # 401e00 <_GLOBAL_OFFSET_TABLE_+0x8>
4004c6: ff 25 3c 19 00 00 jmp *0x193c(%rip) # 401e08 <_GLOBAL_OFFSET_TABLE_+0x10>
4004cc: 0f 1f 40 00 nopl 0x0(%rax)
00000000004004d0 <atexit@plt>:
4004d0: ff 25 3a 19 00 00 jmp *0x193a(%rip) # 401e10 <atexit@FBSD_1.0>
4004d6: 68 00 00 00 00 push $0x0
4004db: e9 e0 ff ff ff jmp 4004c0 <_init+0x18>
00000000004004e0 <printf@plt>:
4004e0: ff 25 32 19 00 00 jmp *0x1932(%rip) # 401e18 <printf@FBSD_1.0>
4004e6: 68 01 00 00 00 push $0x1
4004eb: e9 d0 ff ff ff jmp 4004c0 <_init+0x18>
00000000004004f0 <exit@plt>:
4004f0: ff 25 2a 19 00 00 jmp *0x192a(%rip) # 401e20 <exit@FBSD_1.0>
4004f6: 68 02 00 00 00 push $0x2
4004fb: e9 c0 ff ff ff jmp 4004c0 <_init+0x18>
0000000000400500 <_init_tls@plt>:
400500: ff 25 22 19 00 00 jmp *0x1922(%rip) # 401e28 <_init_tls@FBSD_1.0>
400506: 68 03 00 00 00 push $0x3
40050b: e9 b0 ff ff ff jmp 4004c0 <_init+0x18>
セクション .text の逆アセンブル:
0000000000400510 <_start>:
400510: 55 push %rbp
400511: 48 89 e5 mov %rsp,%rbp
400514: 41 57 push %r15
400516: 41 56 push %r14
400518: 41 55 push %r13
40051a: 41 54 push %r12
40051c: 53 push %rbx
40051d: 50 push %rax
40051e: 49 89 fe mov %rdi,%r14
400521: 4c 8b 3f mov (%rdi),%r15
400524: 49 63 c7 movslq %r15d,%rax
400527: 48 8d 1c c7 lea (%rdi,%rax,8),%rbx
40052b: 48 83 c3 10 add $0x10,%rbx
40052f: 48 83 3d 09 19 00 00 cmpq $0x0,0x1909(%rip) # 401e40 <environ>
400536: 00
400537: 75 07 jne 400540 <_start+0x30>
400539: 48 89 1d 00 19 00 00 mov %rbx,0x1900(%rip) # 401e40 <environ>
400540: 49 83 c6 08 add $0x8,%r14
400544: 45 85 ff test %r15d,%r15d
400547: 7e 2f jle 400578 <_start+0x68>
400549: 49 8b 06 mov (%r14),%rax
40054c: 48 85 c0 test %rax,%rax
40054f: 74 27 je 400578 <_start+0x68>
400551: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1)
400558: 00 00 00
40055b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
400560: 48 89 05 c9 18 00 00 mov %rax,0x18c9(%rip) # 401e30 <__progname>
400567: 48 83 c0 01 add $0x1,%rax
40056b: 0f b6 48 ff movzbl -0x1(%rax),%ecx
40056f: 80 f9 2f cmp $0x2f,%cl
400572: 74 ec je 400560 <_start+0x50>
400574: 84 c9 test %cl,%cl
400576: 75 ef jne 400567 <_start+0x57>
400578: b8 58 1c 40 00 mov $0x401c58,%eax
40057d: 48 85 c0 test %rax,%rax
400580: 74 0a je 40058c <_start+0x7c>
400582: 48 89 f7 mov %rsi,%rdi
400585: e8 46 ff ff ff call 4004d0 <atexit@plt>
40058a: eb 68 jmp 4005f4 <_start+0xe4>
40058c: 48 89 5d d0 mov %rbx,-0x30(%rbp)
400590: 41 bd a8 04 40 00 mov $0x4004a8,%r13d
400596: eb 0c jmp 4005a4 <_start+0x94>
400598: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
40059f: 00
4005a0: 49 83 c5 18 add $0x18,%r13
4005a4: 49 81 fd a8 04 40 00 cmp $0x4004a8,%r13
4005ab: 73 3e jae 4005eb <_start+0xdb>
4005ad: b8 01 00 00 00 mov $0x1,%eax
4005b2: 0f a2 cpuid
4005b4: 89 d7 mov %edx,%edi
4005b6: 89 ce mov %ecx,%esi
4005b8: 31 c0 xor %eax,%eax
4005ba: 0f a2 cpuid
4005bc: bb 00 00 00 00 mov $0x0,%ebx
4005c1: b9 00 00 00 00 mov $0x0,%ecx
4005c6: 83 f8 07 cmp $0x7,%eax
4005c9: 72 09 jb 4005d4 <_start+0xc4>
4005cb: 31 c9 xor %ecx,%ecx
4005cd: b8 07 00 00 00 mov $0x7,%eax
4005d2: 0f a2 cpuid
4005d4: 41 83 7d 08 25 cmpl $0x25,0x8(%r13)
4005d9: 75 c5 jne 4005a0 <_start+0x90>
4005db: 4d 8b 65 00 mov 0x0(%r13),%r12
4005df: 89 da mov %ebx,%edx
4005e1: 41 ff 55 10 call *0x10(%r13)
4005e5: 49 89 04 24 mov %rax,(%r12)
4005e9: eb b5 jmp 4005a0 <_start+0x90>
4005eb: e8 10 ff ff ff call 400500 <_init_tls@plt>
4005f0: 48 8b 5d d0 mov -0x30(%rbp),%rbx
4005f4: 44 89 ff mov %r15d,%edi
4005f7: 4c 89 f6 mov %r14,%rsi
4005fa: 48 89 da mov %rbx,%rdx
4005fd: e8 1e 00 00 00 call 400620 <handle_static_init>
400602: 44 89 ff mov %r15d,%edi
400605: 4c 89 f6 mov %r14,%rsi
400608: 48 89 da mov %rbx,%rdx
40060b: e8 85 02 00 00 call 400895 <main>
400610: 89 c7 mov %eax,%edi
400612: e8 d9 fe ff ff call 4004f0 <exit@plt>
400617: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1)
40061e: 00 00
0000000000400620 <handle_static_init>:
400620: 55 push %rbp
400621: 48 89 e5 mov %rsp,%rbp
400624: 41 57 push %r15
400626: 41 56 push %r14
400628: 41 55 push %r13
40062a: 41 54 push %r12
40062c: 53 push %rbx
40062d: 50 push %rax
40062e: b8 58 1c 40 00 mov $0x401c58,%eax
400633: 48 85 c0 test %rax,%rax
400636: 0f 85 e8 00 00 00 jne 400724 <handle_static_init+0x104>
40063c: 49 89 d6 mov %rdx,%r14
40063f: 49 89 f7 mov %rsi,%r15
400642: 41 89 fc mov %edi,%r12d
400645: bf 40 07 40 00 mov $0x400740,%edi
40064a: e8 81 fe ff ff call 4004d0 <atexit@plt>
40064f: b8 38 1c 40 00 mov $0x401c38,%eax
400654: b9 38 1c 40 00 mov $0x401c38,%ecx
400659: 48 29 c1 sub %rax,%rcx
40065c: 48 8d 41 07 lea 0x7(%rcx),%rax
400660: 48 85 c9 test %rcx,%rcx
400663: 48 89 ca mov %rcx,%rdx
400666: 48 0f 48 d0 cmovs %rax,%rdx
40066a: 48 c1 fa 03 sar $0x3,%rdx
40066e: 74 44 je 4006b4 <handle_static_init+0x94>
400670: 48 85 c9 test %rcx,%rcx
400673: 48 0f 49 c1 cmovns %rcx,%rax
400677: 48 c1 f8 03 sar $0x3,%rax
40067b: 48 83 f8 02 cmp $0x2,%rax
40067f: 41 bd 01 00 00 00 mov $0x1,%r13d
400685: 4c 0f 43 e8 cmovae %rax,%r13
400689: 31 db xor %ebx,%ebx
40068b: eb 0c jmp 400699 <handle_static_init+0x79>
40068d: 0f 1f 00 nopl (%rax)
400690: 48 83 c3 01 add $0x1,%rbx
400694: 49 39 dd cmp %rbx,%r13
400697: 74 1b je 4006b4 <handle_static_init+0x94>
400699: 48 8b 04 dd 38 1c 40 mov 0x401c38(,%rbx,8),%rax
4006a0: 00
4006a1: 48 83 f8 02 cmp $0x2,%rax
4006a5: 72 e9 jb 400690 <handle_static_init+0x70>
4006a7: 44 89 e7 mov %r12d,%edi
4006aa: 4c 89 fe mov %r15,%rsi
4006ad: 4c 89 f2 mov %r14,%rdx
4006b0: ff d0 call *%rax
4006b2: eb dc jmp 400690 <handle_static_init+0x70>
4006b4: e8 ef fd ff ff call 4004a8 <_init>
4006b9: b8 38 1c 40 00 mov $0x401c38,%eax
4006be: b9 38 1c 40 00 mov $0x401c38,%ecx
4006c3: 48 29 c1 sub %rax,%rcx
4006c6: 48 8d 41 07 lea 0x7(%rcx),%rax
4006ca: 48 85 c9 test %rcx,%rcx
4006cd: 48 89 ca mov %rcx,%rdx
4006d0: 48 0f 48 d0 cmovs %rax,%rdx
4006d4: 48 c1 fa 03 sar $0x3,%rdx
4006d8: 74 4a je 400724 <handle_static_init+0x104>
4006da: 48 85 c9 test %rcx,%rcx
4006dd: 48 0f 49 c1 cmovns %rcx,%rax
4006e1: 48 c1 f8 03 sar $0x3,%rax
4006e5: 48 83 f8 02 cmp $0x2,%rax
4006e9: 41 bd 01 00 00 00 mov $0x1,%r13d
4006ef: 4c 0f 43 e8 cmovae %rax,%r13
4006f3: 31 db xor %ebx,%ebx
4006f5: eb 12 jmp 400709 <handle_static_init+0xe9>
4006f7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1)
4006fe: 00 00
400700: 48 83 c3 01 add $0x1,%rbx
400704: 49 39 dd cmp %rbx,%r13
400707: 74 1b je 400724 <handle_static_init+0x104>
400709: 48 8b 04 dd 38 1c 40 mov 0x401c38(,%rbx,8),%rax
400710: 00
400711: 48 83 f8 02 cmp $0x2,%rax
400715: 72 e9 jb 400700 <handle_static_init+0xe0>
400717: 44 89 e7 mov %r12d,%edi
40071a: 4c 89 fe mov %r15,%rsi
40071d: 4c 89 f2 mov %r14,%rdx
400720: ff d0 call *%rax
400722: eb dc jmp 400700 <handle_static_init+0xe0>
400724: 48 83 c4 08 add $0x8,%rsp
400728: 5b pop %rbx
400729: 41 5c pop %r12
40072b: 41 5d pop %r13
40072d: 41 5e pop %r14
40072f: 41 5f pop %r15
400731: 5d pop %rbp
400732: c3 ret
400733: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1)
40073a: 00 00 00
40073d: 0f 1f 00 nopl (%rax)
0000000000400740 <finalizer>:
400740: 55 push %rbp
400741: 48 89 e5 mov %rsp,%rbp
400744: 53 push %rbx
400745: 50 push %rax
400746: b9 38 1c 40 00 mov $0x401c38,%ecx
40074b: b8 38 1c 40 00 mov $0x401c38,%eax
400750: 48 29 c8 sub %rcx,%rax
400753: 48 8d 58 07 lea 0x7(%rax),%rbx
400757: 48 85 c0 test %rax,%rax
40075a: 48 89 c1 mov %rax,%rcx
40075d: 48 0f 48 cb cmovs %rbx,%rcx
400761: 48 c1 f9 03 sar $0x3,%rcx
400765: 75 0b jne 400772 <finalizer+0x32>
400767: 48 83 c4 08 add $0x8,%rsp
40076b: 5b pop %rbx
40076c: 5d pop %rbp
40076d: e9 e2 03 00 00 jmp 400b54 <_fini>
400772: 48 85 c0 test %rax,%rax
400775: 48 0f 49 d8 cmovns %rax,%rbx
400779: 48 c1 fb 03 sar $0x3,%rbx
40077d: eb 06 jmp 400785 <finalizer+0x45>
40077f: 90 nop
400780: 48 85 db test %rbx,%rbx
400783: 74 e2 je 400767 <finalizer+0x27>
400785: 48 8b 04 dd 30 1c 40 mov 0x401c30(,%rbx,8),%rax
40078c: 00
40078d: 48 83 c3 ff add $0xffffffffffffffff,%rbx
400791: 48 83 f8 02 cmp $0x2,%rax
400795: 72 e9 jb 400780 <finalizer+0x40>
400797: ff d0 call *%rax
400799: eb e5 jmp 400780 <finalizer+0x40>
40079b: cc int3
40079c: 0f 1f 40 00 nopl 0x0(%rax)
00000000004007a0 <deregister_tm_clones>:
4007a0: 48 8d 3d 99 16 00 00 lea 0x1699(%rip),%rdi # 401e40 <environ>
4007a7: 48 8d 05 92 16 00 00 lea 0x1692(%rip),%rax # 401e40 <environ>
4007ae: 48 39 f8 cmp %rdi,%rax
4007b1: 74 15 je 4007c8 <deregister_tm_clones+0x28>
4007b3: 48 8b 05 2e 16 00 00 mov 0x162e(%rip),%rax # 401de8 <_ITM_deregisterTMCloneTable@Base>
4007ba: 48 85 c0 test %rax,%rax
4007bd: 74 09 je 4007c8 <deregister_tm_clones+0x28>
4007bf: ff e0 jmp *%rax
4007c1: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
4007c8: c3 ret
4007c9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
00000000004007d0 <register_tm_clones>:
4007d0: 48 8d 3d 69 16 00 00 lea 0x1669(%rip),%rdi # 401e40 <environ>
4007d7: 48 8d 35 62 16 00 00 lea 0x1662(%rip),%rsi # 401e40 <environ>
4007de: 48 29 fe sub %rdi,%rsi
4007e1: 48 89 f0 mov %rsi,%rax
4007e4: 48 c1 ee 3f shr $0x3f,%rsi
4007e8: 48 c1 f8 03 sar $0x3,%rax
4007ec: 48 01 c6 add %rax,%rsi
4007ef: 48 d1 fe sar %rsi
4007f2: 74 14 je 400808 <register_tm_clones+0x38>
4007f4: 48 8b 05 f5 15 00 00 mov 0x15f5(%rip),%rax # 401df0 <_ITM_registerTMCloneTable@Base>
4007fb: 48 85 c0 test %rax,%rax
4007fe: 74 08 je 400808 <register_tm_clones+0x38>
400800: ff e0 jmp *%rax
400802: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)
400808: c3 ret
400809: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
0000000000400810 <__do_global_dtors_aux>:
400810: 80 3d 31 16 00 00 00 cmpb $0x0,0x1631(%rip) # 401e48 <completed.1>
400817: 75 67 jne 400880 <__do_global_dtors_aux+0x70>
400819: 55 push %rbp
40081a: 48 8d 05 27 14 00 00 lea 0x1427(%rip),%rax # 401c48 <__DTOR_LIST__>
400821: 48 89 e5 mov %rsp,%rbp
400824: 41 54 push %r12
400826: 49 89 c4 mov %rax,%r12
400829: 53 push %rbx
40082a: 48 8d 1d 1f 14 00 00 lea 0x141f(%rip),%rbx # 401c50 <__DTOR_END__>
400831: 48 29 c3 sub %rax,%rbx
400834: 48 8b 05 15 16 00 00 mov 0x1615(%rip),%rax # 401e50 <dtor_idx.0>
40083b: 48 c1 fb 03 sar $0x3,%rbx
40083f: 48 83 eb 01 sub $0x1,%rbx
400843: 48 39 d8 cmp %rbx,%rax
400846: 73 23 jae 40086b <__do_global_dtors_aux+0x5b>
400848: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
40084f: 00
400850: 48 83 c0 01 add $0x1,%rax
400854: 48 89 05 f5 15 00 00 mov %rax,0x15f5(%rip) # 401e50 <dtor_idx.0>
40085b: 41 ff 14 c4 call *(%r12,%rax,8)
40085f: 48 8b 05 ea 15 00 00 mov 0x15ea(%rip),%rax # 401e50 <dtor_idx.0>
400866: 48 39 d8 cmp %rbx,%rax
400869: 72 e5 jb 400850 <__do_global_dtors_aux+0x40>
40086b: e8 30 ff ff ff call 4007a0 <deregister_tm_clones>
400870: 5b pop %rbx
400871: 41 5c pop %r12
400873: c6 05 ce 15 00 00 01 movb $0x1,0x15ce(%rip) # 401e48 <completed.1>
40087a: 5d pop %rbp
40087b: c3 ret
40087c: 0f 1f 40 00 nopl 0x0(%rax)
400880: c3 ret
400881: 66 66 2e 0f 1f 84 00 data16 cs nopw 0x0(%rax,%rax,1)
400888: 00 00 00 00
40088c: 0f 1f 40 00 nopl 0x0(%rax)
0000000000400890 <frame_dummy>:
400890: e9 3b ff ff ff jmp 4007d0 <register_tm_clones>
0000000000400895 <main>:
400895: 4c 8d 54 24 08 lea 0x8(%rsp),%r10
40089a: 48 83 e4 e0 and $0xffffffffffffffe0,%rsp
40089e: 41 ff 72 f8 push -0x8(%r10)
4008a2: 55 push %rbp
4008a3: 48 89 e5 mov %rsp,%rbp
4008a6: 41 52 push %r10
4008a8: 48 81 ec 28 01 00 00 sub $0x128,%rsp
4008af: 89 bd ec fe ff ff mov %edi,-0x114(%rbp)
4008b5: 48 89 b5 e0 fe ff ff mov %rsi,-0x120(%rbp)
4008bc: c7 45 e8 08 00 00 00 movl $0x8,-0x18(%rbp)
4008c3: c7 45 ec 00 00 00 00 movl $0x0,-0x14(%rbp)
4008ca: e9 b0 01 00 00 jmp 400a7f <main+0x1ea>
4008cf: c7 85 2c ff ff ff 01 movl $0x1,-0xd4(%rbp)
4008d6: 00 00 00
4008d9: c7 85 28 ff ff ff 02 movl $0x2,-0xd8(%rbp)
4008e0: 00 00 00
4008e3: c7 85 24 ff ff ff 03 movl $0x3,-0xdc(%rbp)
4008ea: 00 00 00
4008ed: c7 85 20 ff ff ff 04 movl $0x4,-0xe0(%rbp)
4008f4: 00 00 00
4008f7: c7 85 1c ff ff ff 05 movl $0x5,-0xe4(%rbp)
4008fe: 00 00 00
400901: c7 85 18 ff ff ff 06 movl $0x6,-0xe8(%rbp)
400908: 00 00 00
40090b: c7 85 14 ff ff ff 07 movl $0x7,-0xec(%rbp)
400912: 00 00 00
400915: c7 85 10 ff ff ff 08 movl $0x8,-0xf0(%rbp)
40091c: 00 00 00
40091f: 8b 85 2c ff ff ff mov -0xd4(%rbp),%eax
400925: 8b 95 28 ff ff ff mov -0xd8(%rbp),%edx
40092b: c5 f9 6e da vmovd %edx,%xmm3
40092f: c4 e3 61 22 c8 01 vpinsrd $0x1,%eax,%xmm3,%xmm1
400935: 8b 85 24 ff ff ff mov -0xdc(%rbp),%eax
40093b: 8b 95 20 ff ff ff mov -0xe0(%rbp),%edx
400941: c5 f9 6e e2 vmovd %edx,%xmm4
400945: c4 e3 59 22 c0 01 vpinsrd $0x1,%eax,%xmm4,%xmm0
40094b: c5 f9 6c c9 vpunpcklqdq %xmm1,%xmm0,%xmm1
40094f: 8b 85 1c ff ff ff mov -0xe4(%rbp),%eax
400955: 8b 95 18 ff ff ff mov -0xe8(%rbp),%edx
40095b: c5 f9 6e ea vmovd %edx,%xmm5
40095f: c4 e3 51 22 d0 01 vpinsrd $0x1,%eax,%xmm5,%xmm2
400965: 8b 85 14 ff ff ff mov -0xec(%rbp),%eax
40096b: 8b 95 10 ff ff ff mov -0xf0(%rbp),%edx
400971: c5 f9 6e f2 vmovd %edx,%xmm6
400975: c4 e3 49 22 c0 01 vpinsrd $0x1,%eax,%xmm6,%xmm0
40097b: c5 f9 6c c2 vpunpcklqdq %xmm2,%xmm0,%xmm0
40097f: c4 e3 7d 38 c1 01 vinserti128 $0x1,%xmm1,%ymm0,%ymm0
400985: c5 fd 7f 45 b0 vmovdqa %ymm0,-0x50(%rbp)
40098a: c7 85 4c ff ff ff 08 movl $0x8,-0xb4(%rbp)
400991: 00 00 00
400994: c7 85 48 ff ff ff 07 movl $0x7,-0xb8(%rbp)
40099b: 00 00 00
40099e: c7 85 44 ff ff ff 06 movl $0x6,-0xbc(%rbp)
4009a5: 00 00 00
4009a8: c7 85 40 ff ff ff 05 movl $0x5,-0xc0(%rbp)
4009af: 00 00 00
4009b2: c7 85 3c ff ff ff 04 movl $0x4,-0xc4(%rbp)
4009b9: 00 00 00
4009bc: c7 85 38 ff ff ff 03 movl $0x3,-0xc8(%rbp)
4009c3: 00 00 00
4009c6: c7 85 34 ff ff ff 02 movl $0x2,-0xcc(%rbp)
4009cd: 00 00 00
4009d0: c7 85 30 ff ff ff 01 movl $0x1,-0xd0(%rbp)
4009d7: 00 00 00
4009da: 8b 85 4c ff ff ff mov -0xb4(%rbp),%eax
4009e0: 8b 95 48 ff ff ff mov -0xb8(%rbp),%edx
4009e6: c5 f9 6e fa vmovd %edx,%xmm7
4009ea: c4 e3 41 22 c8 01 vpinsrd $0x1,%eax,%xmm7,%xmm1
4009f0: 8b 85 44 ff ff ff mov -0xbc(%rbp),%eax
4009f6: 8b 95 40 ff ff ff mov -0xc0(%rbp),%edx
4009fc: c5 f9 6e da vmovd %edx,%xmm3
400a00: c4 e3 61 22 c0 01 vpinsrd $0x1,%eax,%xmm3,%xmm0
400a06: c5 f9 6c c9 vpunpcklqdq %xmm1,%xmm0,%xmm1
400a0a: 8b 85 3c ff ff ff mov -0xc4(%rbp),%eax
400a10: 8b 95 38 ff ff ff mov -0xc8(%rbp),%edx
400a16: c5 f9 6e e2 vmovd %edx,%xmm4
400a1a: c4 e3 59 22 d0 01 vpinsrd $0x1,%eax,%xmm4,%xmm2
400a20: 8b 85 34 ff ff ff mov -0xcc(%rbp),%eax
400a26: 8b 95 30 ff ff ff mov -0xd0(%rbp),%edx
400a2c: c5 f9 6e ea vmovd %edx,%xmm5
400a30: c4 e3 51 22 c0 01 vpinsrd $0x1,%eax,%xmm5,%xmm0
400a36: c5 f9 6c c2 vpunpcklqdq %xmm2,%xmm0,%xmm0
400a3a: c4 e3 7d 38 c1 01 vinserti128 $0x1,%xmm1,%ymm0,%ymm0
400a40: c5 fd 7f 45 90 vmovdqa %ymm0,-0x70(%rbp)
400a45: c5 fd 6f 45 b0 vmovdqa -0x50(%rbp),%ymm0
400a4a: c5 fd 7f 85 70 ff ff vmovdqa %ymm0,-0x90(%rbp)
400a51: ff
400a52: c5 fd 6f 45 90 vmovdqa -0x70(%rbp),%ymm0
400a57: c5 fd 7f 85 50 ff ff vmovdqa %ymm0,-0xb0(%rbp)
400a5e: ff
400a5f: c5 fd 6f 8d 70 ff ff vmovdqa -0x90(%rbp),%ymm1
400a66: ff
400a67: c5 fd 6f 85 50 ff ff vmovdqa -0xb0(%rbp),%ymm0
400a6e: ff
400a6f: c5 f5 fe c0 vpaddd %ymm0,%ymm1,%ymm0
400a73: 90 nop
400a74: c5 fd 7f 85 f0 fe ff vmovdqa %ymm0,-0x110(%rbp)
400a7b: ff
400a7c: ff 45 ec incl -0x14(%rbp)
400a7f: 81 7d ec 7f 96 98 00 cmpl $0x98967f,-0x14(%rbp)
400a86: 0f 8e 43 fe ff ff jle 4008cf <main+0x3a>
400a8c: 48 8d 85 f0 fe ff ff lea -0x110(%rbp),%rax
400a93: 48 89 45 e0 mov %rax,-0x20(%rbp)
400a97: 48 8b 45 e0 mov -0x20(%rbp),%rax
400a9b: 44 8b 00 mov (%rax),%r8d
400a9e: 48 8b 45 e0 mov -0x20(%rbp),%rax
400aa2: 48 83 c0 04 add $0x4,%rax
400aa6: 8b 38 mov (%rax),%edi
400aa8: 48 8b 45 e0 mov -0x20(%rbp),%rax
400aac: 48 83 c0 08 add $0x8,%rax
400ab0: 8b 30 mov (%rax),%esi
400ab2: 48 8b 45 e0 mov -0x20(%rbp),%rax
400ab6: 48 83 c0 0c add $0xc,%rax
400aba: 44 8b 08 mov (%rax),%r9d
400abd: 48 8b 45 e0 mov -0x20(%rbp),%rax
400ac1: 48 83 c0 10 add $0x10,%rax
400ac5: 44 8b 10 mov (%rax),%r10d
400ac8: 48 8b 45 e0 mov -0x20(%rbp),%rax
400acc: 48 83 c0 14 add $0x14,%rax
400ad0: 8b 08 mov (%rax),%ecx
400ad2: 48 8b 45 e0 mov -0x20(%rbp),%rax
400ad6: 48 83 c0 18 add $0x18,%rax
400ada: 8b 10 mov (%rax),%edx
400adc: 48 8b 45 e0 mov -0x20(%rbp),%rax
400ae0: 48 83 c0 1c add $0x1c,%rax
400ae4: 8b 00 mov (%rax),%eax
400ae6: 48 83 ec 08 sub $0x8,%rsp
400aea: 41 50 push %r8
400aec: 57 push %rdi
400aed: 56 push %rsi
400aee: 45 89 d0 mov %r10d,%r8d
400af1: 89 c6 mov %eax,%esi
400af3: bf 70 0b 40 00 mov $0x400b70,%edi
400af8: b8 00 00 00 00 mov $0x0,%eax
400afd: e8 de f9 ff ff call 4004e0 <printf@plt>
400b02: 48 83 c4 20 add $0x20,%rsp
400b06: bf 00 00 00 00 mov $0x0,%edi
400b0b: e8 e0 f9 ff ff call 4004f0 <exit@plt>
0000000000400b10 <__do_global_ctors_aux>:
400b10: 48 8b 05 21 11 00 00 mov 0x1121(%rip),%rax # 401c38 <__CTOR_LIST__>
400b17: 48 83 f8 ff cmp $0xffffffffffffffff,%rax
400b1b: 74 33 je 400b50 <__do_global_ctors_aux+0x40>
400b1d: 55 push %rbp
400b1e: 48 89 e5 mov %rsp,%rbp
400b21: 53 push %rbx
400b22: 48 8d 1d 0f 11 00 00 lea 0x110f(%rip),%rbx # 401c38 <__CTOR_LIST__>
400b29: 48 83 ec 08 sub $0x8,%rsp
400b2d: 0f 1f 00 nopl (%rax)
400b30: ff d0 call *%rax
400b32: 48 8b 43 f8 mov -0x8(%rbx),%rax
400b36: 48 83 eb 08 sub $0x8,%rbx
400b3a: 48 83 f8 ff cmp $0xffffffffffffffff,%rax
400b3e: 75 f0 jne 400b30 <__do_global_ctors_aux+0x20>
400b40: 48 8b 5d f8 mov -0x8(%rbp),%rbx
400b44: c9 leave
400b45: c3 ret
400b46: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1)
400b4d: 00 00 00
400b50: c3 ret
400b51: 0f 1f 00 nopl (%rax)
セクション .fini の逆アセンブル:
0000000000400b54 <_fini>:
400b54: 48 83 ec 08 sub $0x8,%rsp
400b58: e8 b3 fc ff ff call 400810 <__do_global_dtors_aux>
400b5d: 48 83 c4 08 add $0x8,%rsp
400b61: c3 retうむ。処理数が大幅にアップしましましたが、AVXを利用しているのを確認
で、実際に実行してみると
raichi@lena:~/works/R-MIX/TP/tp113 % time ./a.out
ベクトルA + ベクトルB = [-2000199036, -828670540, -277146058, 1109089554, 1912549470, 1446969634, -2107940384, -1895884243]
1.127u 0.000s 0:01.12 100.0% 5+168k 0+0io 0pf+0w
raichi@lena:~/works/R-MIX/TP/tp113 % time ./a.out
ベクトルA + ベクトルB = [-2000199036, -828670540, -277146058, 1109089554, 1912549470, 1446969634, -2107940384, -1895884243]
1.128u 0.000s 0:01.12 100.0% 5+168k 0+0io 0pf+0w
raichi@lena:~/works/R-MIX/TP/tp113 % time ./a.out
ベクトルA + ベクトルB = [-2000199036, -828670540, -277146058, 1109089554, 1912549470, 1446969634, -2107940384, -1895884243]
1.137u 0.000s 0:01.13 100.0% 5+168k 0+0io 0pf+0w
raichi@lena:~/works/R-MIX/TP/tp113 %うん、rand()を利用したとは言え、各段に遅くなっています。
では、最適化オプションを利用してみます
./a.out: ファイル形式 elf64-x86-64-freebsd
セクション .init の逆アセンブル:
0000000000400500 <_init>:
400500: 48 83 ec 08 sub $0x8,%rsp
400504: e8 d7 05 00 00 call 400ae0 <frame_dummy>
400509: e8 e2 05 00 00 call 400af0 <__do_global_ctors_aux>
40050e: 48 83 c4 08 add $0x8,%rsp
400512: c3 ret
セクション .plt の逆アセンブル:
0000000000400520 <atexit@plt-0x10>:
400520: ff 35 d2 18 00 00 push 0x18d2(%rip) # 401df8 <_GLOBAL_OFFSET_TABLE_+0x8>
400526: ff 25 d4 18 00 00 jmp *0x18d4(%rip) # 401e00 <_GLOBAL_OFFSET_TABLE_+0x10>
40052c: 0f 1f 40 00 nopl 0x0(%rax)
0000000000400530 <atexit@plt>:
400530: ff 25 d2 18 00 00 jmp *0x18d2(%rip) # 401e08 <atexit@FBSD_1.0>
400536: 68 00 00 00 00 push $0x0
40053b: e9 e0 ff ff ff jmp 400520 <_init+0x20>
0000000000400540 <printf@plt>:
400540: ff 25 ca 18 00 00 jmp *0x18ca(%rip) # 401e10 <printf@FBSD_1.0>
400546: 68 01 00 00 00 push $0x1
40054b: e9 d0 ff ff ff jmp 400520 <_init+0x20>
0000000000400550 <exit@plt>:
400550: ff 25 c2 18 00 00 jmp *0x18c2(%rip) # 401e18 <exit@FBSD_1.0>
400556: 68 02 00 00 00 push $0x2
40055b: e9 c0 ff ff ff jmp 400520 <_init+0x20>
0000000000400560 <rand@plt>:
400560: ff 25 ba 18 00 00 jmp *0x18ba(%rip) # 401e20 <rand@FBSD_1.6>
400566: 68 03 00 00 00 push $0x3
40056b: e9 b0 ff ff ff jmp 400520 <_init+0x20>
0000000000400570 <_init_tls@plt>:
400570: ff 25 b2 18 00 00 jmp *0x18b2(%rip) # 401e28 <_init_tls@FBSD_1.0>
400576: 68 04 00 00 00 push $0x4
40057b: e9 a0 ff ff ff jmp 400520 <_init+0x20>
セクション .text の逆アセンブル:
0000000000400580 <main>:
400580: 4c 8d 54 24 08 lea 0x8(%rsp),%r10
400585: 48 83 e4 e0 and $0xffffffffffffffe0,%rsp
400589: 41 ff 72 f8 push -0x8(%r10)
40058d: 55 push %rbp
40058e: 48 89 e5 mov %rsp,%rbp
400591: 41 57 push %r15
400593: 41 bf 80 96 98 00 mov $0x989680,%r15d
400599: 41 56 push %r14
40059b: 41 55 push %r13
40059d: 41 54 push %r12
40059f: 41 52 push %r10
4005a1: 53 push %rbx
4005a2: 48 83 ec 40 sub $0x40,%rsp
4005a6: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1)
4005ad: 00 00 00
4005b0: e8 ab ff ff ff call 400560 <rand@plt>
4005b5: 89 45 cc mov %eax,-0x34(%rbp)
4005b8: e8 a3 ff ff ff call 400560 <rand@plt>
4005bd: 89 45 c8 mov %eax,-0x38(%rbp)
4005c0: e8 9b ff ff ff call 400560 <rand@plt>
4005c5: 89 45 c4 mov %eax,-0x3c(%rbp)
4005c8: e8 93 ff ff ff call 400560 <rand@plt>
4005cd: 89 45 c0 mov %eax,-0x40(%rbp)
4005d0: e8 8b ff ff ff call 400560 <rand@plt>
4005d5: 89 45 bc mov %eax,-0x44(%rbp)
4005d8: e8 83 ff ff ff call 400560 <rand@plt>
4005dd: 89 45 b8 mov %eax,-0x48(%rbp)
4005e0: e8 7b ff ff ff call 400560 <rand@plt>
4005e5: 89 45 b4 mov %eax,-0x4c(%rbp)
4005e8: e8 73 ff ff ff call 400560 <rand@plt>
4005ed: 89 45 b0 mov %eax,-0x50(%rbp)
4005f0: e8 6b ff ff ff call 400560 <rand@plt>
4005f5: 89 c3 mov %eax,%ebx
4005f7: e8 64 ff ff ff call 400560 <rand@plt>
4005fc: 41 89 c6 mov %eax,%r14d
4005ff: e8 5c ff ff ff call 400560 <rand@plt>
400604: 41 89 c4 mov %eax,%r12d
400607: e8 54 ff ff ff call 400560 <rand@plt>
40060c: 89 45 ac mov %eax,-0x54(%rbp)
40060f: e8 4c ff ff ff call 400560 <rand@plt>
400614: 89 45 a8 mov %eax,-0x58(%rbp)
400617: e8 44 ff ff ff call 400560 <rand@plt>
40061c: 89 45 a4 mov %eax,-0x5c(%rbp)
40061f: e8 3c ff ff ff call 400560 <rand@plt>
400624: 41 89 c5 mov %eax,%r13d
400627: e8 34 ff ff ff call 400560 <rand@plt>
40062c: 41 ff cf dec %r15d
40062f: 0f 85 7b ff ff ff jne 4005b0 <main+0x30>
400635: 8d 7b 01 lea 0x1(%rbx),%edi
400638: c5 f9 6e c7 vmovd %edi,%xmm0
40063c: 8b 7d a8 mov -0x58(%rbp),%edi
40063f: 8b 4d a4 mov -0x5c(%rbp),%ecx
400642: 83 c7 05 add $0x5,%edi
400645: 8b 55 ac mov -0x54(%rbp),%edx
400648: 41 83 c5 07 add $0x7,%r13d
40064c: 83 c1 06 add $0x6,%ecx
40064f: 83 c0 08 add $0x8,%eax
400652: 41 83 c4 03 add $0x3,%r12d
400656: c5 f9 6e cf vmovd %edi,%xmm1
40065a: c4 c1 79 6e ed vmovd %r13d,%xmm5
40065f: c4 e3 51 22 d0 01 vpinsrd $0x1,%eax,%xmm5,%xmm2
400665: 83 c2 04 add $0x4,%edx
400668: 8b 45 cc mov -0x34(%rbp),%eax
40066b: 41 83 c6 02 add $0x2,%r14d
40066f: c4 e3 71 22 c9 01 vpinsrd $0x1,%ecx,%xmm1,%xmm1
400675: c4 c1 79 6e f4 vmovd %r12d,%xmm6
40067a: c5 f1 6c ca vpunpcklqdq %xmm2,%xmm1,%xmm1
40067e: c4 c3 79 22 c6 01 vpinsrd $0x1,%r14d,%xmm0,%xmm0
400684: c4 e3 49 22 d2 01 vpinsrd $0x1,%edx,%xmm6,%xmm2
40068a: 83 c0 08 add $0x8,%eax
40068d: c5 f9 6c c2 vpunpcklqdq %xmm2,%xmm0,%xmm0
400691: 8b 75 bc mov -0x44(%rbp),%esi
400694: c4 e3 7d 38 c1 01 vinserti128 $0x1,%xmm1,%ymm0,%ymm0
40069a: c5 f9 6e c8 vmovd %eax,%xmm1
40069e: 8b 45 c4 mov -0x3c(%rbp),%eax
4006a1: 83 c6 04 add $0x4,%esi
4006a4: 83 c0 06 add $0x6,%eax
4006a7: 8b 7d b4 mov -0x4c(%rbp),%edi
4006aa: 8b 55 c8 mov -0x38(%rbp),%edx
4006ad: 8b 4d b8 mov -0x48(%rbp),%ecx
4006b0: c5 f9 6e d8 vmovd %eax,%xmm3
4006b4: c5 f9 6e d6 vmovd %esi,%xmm2
4006b8: 8b 45 c0 mov -0x40(%rbp),%eax
4006bb: 8b 75 b0 mov -0x50(%rbp),%esi
4006be: 83 c7 02 add $0x2,%edi
4006c1: 83 c2 07 add $0x7,%edx
4006c4: 83 c0 05 add $0x5,%eax
4006c7: 83 c1 03 add $0x3,%ecx
4006ca: ff c6 inc %esi
4006cc: c5 f9 6e e7 vmovd %edi,%xmm4
4006d0: c4 e3 59 22 e6 01 vpinsrd $0x1,%esi,%xmm4,%xmm4
4006d6: c4 e3 61 22 d8 01 vpinsrd $0x1,%eax,%xmm3,%xmm3
4006dc: c4 e3 69 22 d1 01 vpinsrd $0x1,%ecx,%xmm2,%xmm2
4006e2: c4 e3 71 22 ca 01 vpinsrd $0x1,%edx,%xmm1,%xmm1
4006e8: c5 e9 6c d4 vpunpcklqdq %xmm4,%xmm2,%xmm2
4006ec: c5 f1 6c cb vpunpcklqdq %xmm3,%xmm1,%xmm1
4006f0: c4 e3 75 38 ca 01 vinserti128 $0x1,%xmm2,%ymm1,%ymm1
4006f6: c5 fd fe c1 vpaddd %ymm1,%ymm0,%ymm0
4006fa: c5 f9 6f c8 vmovdqa %xmm0,%xmm1
4006fe: 48 83 ec 08 sub $0x8,%rsp
400702: 48 8d 64 24 f8 lea -0x8(%rsp),%rsp
400707: c4 e3 79 16 c8 01 vpextrd $0x1,%xmm1,%eax
40070d: c5 f9 7e 0c 24 vmovd %xmm1,(%rsp)
400712: 50 push %rax
400713: c4 e3 79 16 c8 02 vpextrd $0x2,%xmm1,%eax
400719: c4 e3 7d 39 c0 01 vextracti128 $0x1,%ymm0,%xmm0
40071f: 50 push %rax
400720: c4 e3 79 16 c1 01 vpextrd $0x1,%xmm0,%ecx
400726: c4 e3 79 16 c2 02 vpextrd $0x2,%xmm0,%edx
40072c: c4 e3 79 16 c6 03 vpextrd $0x3,%xmm0,%esi
400732: c4 c3 79 16 c9 03 vpextrd $0x3,%xmm1,%r9d
400738: c4 c1 79 7e c0 vmovd %xmm0,%r8d
40073d: bf 50 0b 40 00 mov $0x400b50,%edi
400742: 31 c0 xor %eax,%eax
400744: c5 f8 77 vzeroupper
400747: e8 f4 fd ff ff call 400540 <printf@plt>
40074c: 48 83 c4 20 add $0x20,%rsp
400750: 31 ff xor %edi,%edi
400752: e8 f9 fd ff ff call 400550 <exit@plt>
400757: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1)
40075e: 00 00
0000000000400760 <_start>:
400760: 55 push %rbp
400761: 48 89 e5 mov %rsp,%rbp
400764: 41 57 push %r15
400766: 41 56 push %r14
400768: 41 55 push %r13
40076a: 41 54 push %r12
40076c: 53 push %rbx
40076d: 50 push %rax
40076e: 49 89 fe mov %rdi,%r14
400771: 4c 8b 3f mov (%rdi),%r15
400774: 49 63 c7 movslq %r15d,%rax
400777: 48 8d 1c c7 lea (%rdi,%rax,8),%rbx
40077b: 48 83 c3 10 add $0x10,%rbx
40077f: 48 83 3d b9 16 00 00 cmpq $0x0,0x16b9(%rip) # 401e40 <environ>
400786: 00
400787: 75 07 jne 400790 <_start+0x30>
400789: 48 89 1d b0 16 00 00 mov %rbx,0x16b0(%rip) # 401e40 <environ>
400790: 49 83 c6 08 add $0x8,%r14
400794: 45 85 ff test %r15d,%r15d
400797: 7e 2f jle 4007c8 <_start+0x68>
400799: 49 8b 06 mov (%r14),%rax
40079c: 48 85 c0 test %rax,%rax
40079f: 74 27 je 4007c8 <_start+0x68>
4007a1: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1)
4007a8: 00 00 00
4007ab: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
4007b0: 48 89 05 79 16 00 00 mov %rax,0x1679(%rip) # 401e30 <__progname>
4007b7: 48 83 c0 01 add $0x1,%rax
4007bb: 0f b6 48 ff movzbl -0x1(%rax),%ecx
4007bf: 80 f9 2f cmp $0x2f,%cl
4007c2: 74 ec je 4007b0 <_start+0x50>
4007c4: 84 c9 test %cl,%cl
4007c6: 75 ef jne 4007b7 <_start+0x57>
4007c8: b8 50 1c 40 00 mov $0x401c50,%eax
4007cd: 48 85 c0 test %rax,%rax
4007d0: 74 0a je 4007dc <_start+0x7c>
4007d2: 48 89 f7 mov %rsi,%rdi
4007d5: e8 56 fd ff ff call 400530 <atexit@plt>
4007da: eb 68 jmp 400844 <_start+0xe4>
4007dc: 48 89 5d d0 mov %rbx,-0x30(%rbp)
4007e0: 41 bd 00 05 40 00 mov $0x400500,%r13d
4007e6: eb 0c jmp 4007f4 <_start+0x94>
4007e8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
4007ef: 00
4007f0: 49 83 c5 18 add $0x18,%r13
4007f4: 49 81 fd 00 05 40 00 cmp $0x400500,%r13
4007fb: 73 3e jae 40083b <_start+0xdb>
4007fd: b8 01 00 00 00 mov $0x1,%eax
400802: 0f a2 cpuid
400804: 89 d7 mov %edx,%edi
400806: 89 ce mov %ecx,%esi
400808: 31 c0 xor %eax,%eax
40080a: 0f a2 cpuid
40080c: bb 00 00 00 00 mov $0x0,%ebx
400811: b9 00 00 00 00 mov $0x0,%ecx
400816: 83 f8 07 cmp $0x7,%eax
400819: 72 09 jb 400824 <_start+0xc4>
40081b: 31 c9 xor %ecx,%ecx
40081d: b8 07 00 00 00 mov $0x7,%eax
400822: 0f a2 cpuid
400824: 41 83 7d 08 25 cmpl $0x25,0x8(%r13)
400829: 75 c5 jne 4007f0 <_start+0x90>
40082b: 4d 8b 65 00 mov 0x0(%r13),%r12
40082f: 89 da mov %ebx,%edx
400831: 41 ff 55 10 call *0x10(%r13)
400835: 49 89 04 24 mov %rax,(%r12)
400839: eb b5 jmp 4007f0 <_start+0x90>
40083b: e8 30 fd ff ff call 400570 <_init_tls@plt>
400840: 48 8b 5d d0 mov -0x30(%rbp),%rbx
400844: 44 89 ff mov %r15d,%edi
400847: 4c 89 f6 mov %r14,%rsi
40084a: 48 89 da mov %rbx,%rdx
40084d: e8 1e 00 00 00 call 400870 <handle_static_init>
400852: 44 89 ff mov %r15d,%edi
400855: 4c 89 f6 mov %r14,%rsi
400858: 48 89 da mov %rbx,%rdx
40085b: e8 20 fd ff ff call 400580 <main>
400860: 89 c7 mov %eax,%edi
400862: e8 e9 fc ff ff call 400550 <exit@plt>
400867: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1)
40086e: 00 00
0000000000400870 <handle_static_init>:
400870: 55 push %rbp
400871: 48 89 e5 mov %rsp,%rbp
400874: 41 57 push %r15
400876: 41 56 push %r14
400878: 41 55 push %r13
40087a: 41 54 push %r12
40087c: 53 push %rbx
40087d: 50 push %rax
40087e: b8 50 1c 40 00 mov $0x401c50,%eax
400883: 48 85 c0 test %rax,%rax
400886: 0f 85 e8 00 00 00 jne 400974 <handle_static_init+0x104>
40088c: 49 89 d6 mov %rdx,%r14
40088f: 49 89 f7 mov %rsi,%r15
400892: 41 89 fc mov %edi,%r12d
400895: bf 90 09 40 00 mov $0x400990,%edi
40089a: e8 91 fc ff ff call 400530 <atexit@plt>
40089f: b8 30 1c 40 00 mov $0x401c30,%eax
4008a4: b9 30 1c 40 00 mov $0x401c30,%ecx
4008a9: 48 29 c1 sub %rax,%rcx
4008ac: 48 8d 41 07 lea 0x7(%rcx),%rax
4008b0: 48 85 c9 test %rcx,%rcx
4008b3: 48 89 ca mov %rcx,%rdx
4008b6: 48 0f 48 d0 cmovs %rax,%rdx
4008ba: 48 c1 fa 03 sar $0x3,%rdx
4008be: 74 44 je 400904 <handle_static_init+0x94>
4008c0: 48 85 c9 test %rcx,%rcx
4008c3: 48 0f 49 c1 cmovns %rcx,%rax
4008c7: 48 c1 f8 03 sar $0x3,%rax
4008cb: 48 83 f8 02 cmp $0x2,%rax
4008cf: 41 bd 01 00 00 00 mov $0x1,%r13d
4008d5: 4c 0f 43 e8 cmovae %rax,%r13
4008d9: 31 db xor %ebx,%ebx
4008db: eb 0c jmp 4008e9 <handle_static_init+0x79>
4008dd: 0f 1f 00 nopl (%rax)
4008e0: 48 83 c3 01 add $0x1,%rbx
4008e4: 49 39 dd cmp %rbx,%r13
4008e7: 74 1b je 400904 <handle_static_init+0x94>
4008e9: 48 8b 04 dd 30 1c 40 mov 0x401c30(,%rbx,8),%rax
4008f0: 00
4008f1: 48 83 f8 02 cmp $0x2,%rax
4008f5: 72 e9 jb 4008e0 <handle_static_init+0x70>
4008f7: 44 89 e7 mov %r12d,%edi
4008fa: 4c 89 fe mov %r15,%rsi
4008fd: 4c 89 f2 mov %r14,%rdx
400900: ff d0 call *%rax
400902: eb dc jmp 4008e0 <handle_static_init+0x70>
400904: e8 f7 fb ff ff call 400500 <_init>
400909: b8 30 1c 40 00 mov $0x401c30,%eax
40090e: b9 30 1c 40 00 mov $0x401c30,%ecx
400913: 48 29 c1 sub %rax,%rcx
400916: 48 8d 41 07 lea 0x7(%rcx),%rax
40091a: 48 85 c9 test %rcx,%rcx
40091d: 48 89 ca mov %rcx,%rdx
400920: 48 0f 48 d0 cmovs %rax,%rdx
400924: 48 c1 fa 03 sar $0x3,%rdx
400928: 74 4a je 400974 <handle_static_init+0x104>
40092a: 48 85 c9 test %rcx,%rcx
40092d: 48 0f 49 c1 cmovns %rcx,%rax
400931: 48 c1 f8 03 sar $0x3,%rax
400935: 48 83 f8 02 cmp $0x2,%rax
400939: 41 bd 01 00 00 00 mov $0x1,%r13d
40093f: 4c 0f 43 e8 cmovae %rax,%r13
400943: 31 db xor %ebx,%ebx
400945: eb 12 jmp 400959 <handle_static_init+0xe9>
400947: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1)
40094e: 00 00
400950: 48 83 c3 01 add $0x1,%rbx
400954: 49 39 dd cmp %rbx,%r13
400957: 74 1b je 400974 <handle_static_init+0x104>
400959: 48 8b 04 dd 30 1c 40 mov 0x401c30(,%rbx,8),%rax
400960: 00
400961: 48 83 f8 02 cmp $0x2,%rax
400965: 72 e9 jb 400950 <handle_static_init+0xe0>
400967: 44 89 e7 mov %r12d,%edi
40096a: 4c 89 fe mov %r15,%rsi
40096d: 4c 89 f2 mov %r14,%rdx
400970: ff d0 call *%rax
400972: eb dc jmp 400950 <handle_static_init+0xe0>
400974: 48 83 c4 08 add $0x8,%rsp
400978: 5b pop %rbx
400979: 41 5c pop %r12
40097b: 41 5d pop %r13
40097d: 41 5e pop %r14
40097f: 41 5f pop %r15
400981: 5d pop %rbp
400982: c3 ret
400983: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1)
40098a: 00 00 00
40098d: 0f 1f 00 nopl (%rax)
0000000000400990 <finalizer>:
400990: 55 push %rbp
400991: 48 89 e5 mov %rsp,%rbp
400994: 53 push %rbx
400995: 50 push %rax
400996: b9 30 1c 40 00 mov $0x401c30,%ecx
40099b: b8 30 1c 40 00 mov $0x401c30,%eax
4009a0: 48 29 c8 sub %rcx,%rax
4009a3: 48 8d 58 07 lea 0x7(%rax),%rbx
4009a7: 48 85 c0 test %rax,%rax
4009aa: 48 89 c1 mov %rax,%rcx
4009ad: 48 0f 48 cb cmovs %rbx,%rcx
4009b1: 48 c1 f9 03 sar $0x3,%rcx
4009b5: 75 0b jne 4009c2 <finalizer+0x32>
4009b7: 48 83 c4 08 add $0x8,%rsp
4009bb: 5b pop %rbx
4009bc: 5d pop %rbp
4009bd: e9 72 01 00 00 jmp 400b34 <_fini>
4009c2: 48 85 c0 test %rax,%rax
4009c5: 48 0f 49 d8 cmovns %rax,%rbx
4009c9: 48 c1 fb 03 sar $0x3,%rbx
4009cd: eb 06 jmp 4009d5 <finalizer+0x45>
4009cf: 90 nop
4009d0: 48 85 db test %rbx,%rbx
4009d3: 74 e2 je 4009b7 <finalizer+0x27>
4009d5: 48 8b 04 dd 28 1c 40 mov 0x401c28(,%rbx,8),%rax
4009dc: 00
4009dd: 48 83 c3 ff add $0xffffffffffffffff,%rbx
4009e1: 48 83 f8 02 cmp $0x2,%rax
4009e5: 72 e9 jb 4009d0 <finalizer+0x40>
4009e7: ff d0 call *%rax
4009e9: eb e5 jmp 4009d0 <finalizer+0x40>
4009eb: cc int3
4009ec: 0f 1f 40 00 nopl 0x0(%rax)
00000000004009f0 <deregister_tm_clones>:
4009f0: 48 8d 3d 49 14 00 00 lea 0x1449(%rip),%rdi # 401e40 <environ>
4009f7: 48 8d 05 42 14 00 00 lea 0x1442(%rip),%rax # 401e40 <environ>
4009fe: 48 39 f8 cmp %rdi,%rax
400a01: 74 15 je 400a18 <deregister_tm_clones+0x28>
400a03: 48 8b 05 d6 13 00 00 mov 0x13d6(%rip),%rax # 401de0 <_ITM_deregisterTMCloneTable@Base>
400a0a: 48 85 c0 test %rax,%rax
400a0d: 74 09 je 400a18 <deregister_tm_clones+0x28>
400a0f: ff e0 jmp *%rax
400a11: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
400a18: c3 ret
400a19: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
0000000000400a20 <register_tm_clones>:
400a20: 48 8d 3d 19 14 00 00 lea 0x1419(%rip),%rdi # 401e40 <environ>
400a27: 48 8d 35 12 14 00 00 lea 0x1412(%rip),%rsi # 401e40 <environ>
400a2e: 48 29 fe sub %rdi,%rsi
400a31: 48 89 f0 mov %rsi,%rax
400a34: 48 c1 ee 3f shr $0x3f,%rsi
400a38: 48 c1 f8 03 sar $0x3,%rax
400a3c: 48 01 c6 add %rax,%rsi
400a3f: 48 d1 fe sar %rsi
400a42: 74 14 je 400a58 <register_tm_clones+0x38>
400a44: 48 8b 05 9d 13 00 00 mov 0x139d(%rip),%rax # 401de8 <_ITM_registerTMCloneTable@Base>
400a4b: 48 85 c0 test %rax,%rax
400a4e: 74 08 je 400a58 <register_tm_clones+0x38>
400a50: ff e0 jmp *%rax
400a52: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)
400a58: c3 ret
400a59: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
0000000000400a60 <__do_global_dtors_aux>:
400a60: 80 3d e1 13 00 00 00 cmpb $0x0,0x13e1(%rip) # 401e48 <completed.1>
400a67: 75 67 jne 400ad0 <__do_global_dtors_aux+0x70>
400a69: 55 push %rbp
400a6a: 48 8d 05 cf 11 00 00 lea 0x11cf(%rip),%rax # 401c40 <__DTOR_LIST__>
400a71: 48 89 e5 mov %rsp,%rbp
400a74: 41 54 push %r12
400a76: 49 89 c4 mov %rax,%r12
400a79: 53 push %rbx
400a7a: 48 8d 1d c7 11 00 00 lea 0x11c7(%rip),%rbx # 401c48 <__DTOR_END__>
400a81: 48 29 c3 sub %rax,%rbx
400a84: 48 8b 05 c5 13 00 00 mov 0x13c5(%rip),%rax # 401e50 <dtor_idx.0>
400a8b: 48 c1 fb 03 sar $0x3,%rbx
400a8f: 48 83 eb 01 sub $0x1,%rbx
400a93: 48 39 d8 cmp %rbx,%rax
400a96: 73 23 jae 400abb <__do_global_dtors_aux+0x5b>
400a98: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
400a9f: 00
400aa0: 48 83 c0 01 add $0x1,%rax
400aa4: 48 89 05 a5 13 00 00 mov %rax,0x13a5(%rip) # 401e50 <dtor_idx.0>
400aab: 41 ff 14 c4 call *(%r12,%rax,8)
400aaf: 48 8b 05 9a 13 00 00 mov 0x139a(%rip),%rax # 401e50 <dtor_idx.0>
400ab6: 48 39 d8 cmp %rbx,%rax
400ab9: 72 e5 jb 400aa0 <__do_global_dtors_aux+0x40>
400abb: e8 30 ff ff ff call 4009f0 <deregister_tm_clones>
400ac0: 5b pop %rbx
400ac1: 41 5c pop %r12
400ac3: c6 05 7e 13 00 00 01 movb $0x1,0x137e(%rip) # 401e48 <completed.1>
400aca: 5d pop %rbp
400acb: c3 ret
400acc: 0f 1f 40 00 nopl 0x0(%rax)
400ad0: c3 ret
400ad1: 66 66 2e 0f 1f 84 00 data16 cs nopw 0x0(%rax,%rax,1)
400ad8: 00 00 00 00
400adc: 0f 1f 40 00 nopl 0x0(%rax)
0000000000400ae0 <frame_dummy>:
400ae0: e9 3b ff ff ff jmp 400a20 <register_tm_clones>
400ae5: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1)
400aec: 00 00 00
400aef: 90 nop
0000000000400af0 <__do_global_ctors_aux>:
400af0: 48 8b 05 39 11 00 00 mov 0x1139(%rip),%rax # 401c30 <__CTOR_LIST__>
400af7: 48 83 f8 ff cmp $0xffffffffffffffff,%rax
400afb: 74 33 je 400b30 <__do_global_ctors_aux+0x40>
400afd: 55 push %rbp
400afe: 48 89 e5 mov %rsp,%rbp
400b01: 53 push %rbx
400b02: 48 8d 1d 27 11 00 00 lea 0x1127(%rip),%rbx # 401c30 <__CTOR_LIST__>
400b09: 48 83 ec 08 sub $0x8,%rsp
400b0d: 0f 1f 00 nopl (%rax)
400b10: ff d0 call *%rax
400b12: 48 8b 43 f8 mov -0x8(%rbx),%rax
400b16: 48 83 eb 08 sub $0x8,%rbx
400b1a: 48 83 f8 ff cmp $0xffffffffffffffff,%rax
400b1e: 75 f0 jne 400b10 <__do_global_ctors_aux+0x20>
400b20: 48 8b 5d f8 mov -0x8(%rbp),%rbx
400b24: c9 leave
400b25: c3 ret
400b26: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1)
400b2d: 00 00 00
400b30: c3 ret
400b31: 0f 1f 00 nopl (%rax)
セクション .fini の逆アセンブル:
0000000000400b34 <_fini>:
400b34: 48 83 ec 08 sub $0x8,%rsp
400b38: e8 23 ff ff ff call 400a60 <__do_global_dtors_aux>
400b3d: 48 83 c4 08 add $0x8,%rsp
400b41: c3 retうん。今度は、最適化オプションを利用してもAVXが利用されている
raichi@lena:~/works/R-MIX/TP/tp113 % time ./a.out
ベクトルA + ベクトルB = [-2000199036, -828670540, -277146058, 1109089554, 1912549470, 1446969634, -2107940384, -1895884243]
1.136u 0.000s 0:01.13 100.0% 5+168k 0+0io 0pf+0w
raichi@lena:~/works/R-MIX/TP/tp113 % time ./a.out
ベクトルA + ベクトルB = [-2000199036, -828670540, -277146058, 1109089554, 1912549470, 1446969634, -2107940384, -1895884243]
1.127u 0.000s 0:01.12 100.0% 5+168k 0+0io 0pf+0w
raichi@lena:~/works/R-MIX/TP/tp113 % time ./a.out
ベクトルA + ベクトルB = [-2000199036, -828670540, -277146058, 1109089554, 1912549470, 1446969634, -2107940384, -1895884243]
1.118u 0.007s 0:01.12 99.1% 5+168k 0+0io 0pf+0w若干?気持ち?早くなった?って程度ですね。
今回は、サンプルで実施してみましたが、実際に目的をもって記載する場合は、オプション等々も考慮して書いていこうと思います
っと、ここまでがプログラムの話、次は、懐古厨の話
第4話「いいんだよ!」

ちゃんと聞くと、立木さんのように聞こえる。(初回は、福島さんの声で聞こえました)
前回、守くんが会社を飛び出して、「タイムトラベラーならば、干渉するな」的な発言をされて終了しましたが、彼女アホなのか結構色々と今回もやらかしました

一応、この時は、守くんの言葉を守り、未来の物(自分の絵)のことを、ごまかしましたが、

ここ(じゃんがら)であっさり暴露。この時代、タペストリーと言っても分からないだろうけど、おまけのラインナップが、もう「美少女」じゃねぇだろっという。まぁ、こんかいのBDもある意味、特典(カバーソング)につられた所があるので、「おまけ」大事だとは思います。
次回、コノハのエロゲーコレクションの変化が気になります。

しかし、外でガッツリ寝れるのを見ていると、ポジティブおばけすぎますね。どんな修羅場も潜り抜けられそう。
今回は、AT互換機と国民機がでてました。


どちらも刻印がありませんが、外で設置されたのは、32bit?国民機でしょうか。
左側は、NXでしょうか。今でもWindowsがいいとは、まったく思えませんが、絵描きの人たちには、色数が増えるのはうれしいのでしょうね。


たぶん、このシーンで、「Windowsは、音がいい」という印象を付けようとしているかと思いますが、そもそもBeepと普通のサウンドドライバを使ってスピーカ(アンプつき)からでた音に違いがあるのは当たり前で同じ土俵にするのは、どうかと。ハーレムブレードのOPも良い音でしたよ。
あと、ココですごいのが、98で音声を作っているのですが、ディスクが入ってない所と、黒コードが3本(1本は電源、1本はモニタケーブルとして、1本が不明)からN88(ROM)からBeepで、音声(もどき)を出していると想定されます。すごいっすよ、守くん
そして、極めつけの守くんのすごさ。


守くん、98のエロゲー及び趣味のコードは、MS-DOSでアセンブラで書いていましたが、WindowsだとVCを使っている。
アレだけ渋っりぐわいでしたが、プログラマの性で、勉強していたというこだと思いますが、マルチプロセス、オブジェクト指向等々色々と変わった中で、短期間に商品になるものが作成できるのは鬼っすね。私も熟練した今なら構造化プログラムとオブジェクトプログラムを同時に作ることはできますが、昔のこの時点ではできないっすよ。
あと、タブレットの電源周り。

絵からすと、タイプAかな?弱電もできて、おそろしい。
次は、1999年に移動するのでしょうか。

今回の写真、今後未来に行ったら、バックトゥザフューチャーみたく、自分やアルコールソフトのメンバーの下半身が消えていったりすでしょうか。


そろそろこのあたりの時間転移に関わっていそうな人たちの露出があるのでしょうか。
男性は、杉田さんっすかね?