IBM CloudのVirtual Server for VPC(Windows Server/Red Hat Enterprise Linux)でサポートされている命令セットを確認する

# 背景

IBM Cloudの仮想サーバー(Virtual Server for VPC)上に[Tableau Server](https://www.tableau.com/ja-jp/products/server)をインストールすることを検討していました。Tableau Serverは下記の要件で稼働するようです。

- インストールの最小要件
    - OS
        - Microsoft Windows Server 2016、2019 (x64)
        - Amazon Linux 2
        - Red Hat Enterprise Linux (RHEL) 7.3 以降および 8.3 以降
        - CentOS 7.9 以降 (8.x でない)
        - Oracle Linux 7.3 以降 (8.x でない)
        - Ubuntu 16.04 LTS、18.04 LTS および 20.04 LTS (x86 チップセット)
    - **CPU は SSE4.2 および POPCNT 命令セットをサポートしていることが必要**
    - 4 コア/8 V CPU (AWS など)
    - 64 GB 以上のシステムメモリ (最初のノード)
    - 16 GB 以上のシステムメモリ (マルチノード環境での追加ノード)
    - 15 GB 以上の空きディスク領域


上記より、リソースやOSの要件はクリアできるため、Windows ServerおよびLinuxでサポートされている命令セットを確認する必要がありました。この記事では、それぞれのサーバーでの命令セットの確認方法とその結果について記載します。


# Windows Server

OSのバージョンはWindows Server 2019を使用しました。Windows ServerではLinuxのようにコマンドで確認することが難しかったので、Microsoftが提供している[Coreinfo](https://learn.microsoft.com/en-us/sysinternals/downloads/coreinfo)と呼ばれるツールを使いました。

[こちら](https://learn.microsoft.com/en-us/sysinternals/downloads/coreinfo)のリンクからCoreinfoを仮想サーバーにダウンロードし、展開します。

コマンドプロンプトを開いてCoreinfoをダウンロードしたフォルダに移動し、`coreinfo64`を実行します。下記がその結果になります。(長いので折りたたんでいます。)

<details><summary>coreinfo64実行結果</summary>

```:coreinfo64実行結果
Coreinfo v3.6 - Dump information on system CPU and memory topology
Copyright (C) 2008-2022 Mark Russinovich
Sysinternals - www.sysinternals.com


Intel Xeon Processor (Cascadelake)
Intel64 Family 6 Model 85 Stepping 6, GenuineIntel
Microcode signature: 00000001
HTT             *       Hyperthreading enabled
CET             -       Supports Control Flow Enforcement Technology
Kernel CET      -       Kernel-mode CET Enabled
User CET        -       User-mode CET Allowed
HYPERVISOR      *       Hypervisor is present
VMX             *       Supports Intel hardware-assisted virtualization
SVM             -       Supports AMD hardware-assisted virtualization
X64             *       Supports 64-bit mode

SMX             -       Supports Intel trusted execution
SKINIT          -       Supports AMD SKINIT
SGX             -       Supports Intel SGX

NX              *       Supports no-execute page protection
SMEP            *       Supports Supervisor Mode Execution Prevention
SMAP            *       Supports Supervisor Mode Access Prevention
PAGE1GB         *       Supports 1 GB large pages
PAE             *       Supports > 32-bit physical addresses
PAT             *       Supports Page Attribute Table
PSE             *       Supports 4 MB pages
PSE36           *       Supports > 32-bit address 4 MB pages
PGE             *       Supports global bit in page tables
SS              *       Supports bus snooping for cache operations
VME             *       Supports Virtual-8086 mode
RDWRFSGSBASE    *       Supports direct GS/FS base access

FPU             *       Implements i387 floating point instructions
MMX             *       Supports MMX instruction set
MMXEXT          -       Implements AMD MMX extensions
3DNOW           -       Supports 3DNow! instructions
3DNOWEXT        -       Supports 3DNow! extension instructions
SSE             *       Supports Streaming SIMD Extensions
SSE2            *       Supports Streaming SIMD Extensions 2
SSE3            *       Supports Streaming SIMD Extensions 3
SSSE3           *       Supports Supplemental SIMD Extensions 3
SSE4a           -       Supports Streaming SIMDR Extensions 4a
SSE4.1          *       Supports Streaming SIMD Extensions 4.1
SSE4.2          *       Supports Streaming SIMD Extensions 4.2

AES             *       Supports AES extensions
AVX             *       Supports AVX instruction extensions
AVX2            *       Supports AVX2 instruction extensions
AVX-512-F       *       Supports AVX-512 Foundation instructions
AVX-512-DQ      *       Supports AVX-512 double and quadword instructions
AVX-512-IFAMA   -       Supports AVX-512 integer Fused multiply-add instructions
AVX-512-PF      -       Supports AVX-512 prefetch instructions
AVX-512-ER      -       Supports AVX-512 exponential and reciprocal instructions
AVX-512-CD      *       Supports AVX-512 conflict detection instructions
AVX-512-BW      *       Supports AVX-512 byte and word instructions
AVX-512-VL      *       Supports AVX-512 vector length instructions
FMA             *       Supports FMA extensions using YMM state
MSR             *       Implements RDMSR/WRMSR instructions
MTRR            *       Supports Memory Type Range Registers
XSAVE           *       Supports XSAVE/XRSTOR instructions
OSXSAVE         *       Supports XSETBV/XGETBV instructions
RDRAND          *       Supports RDRAND instruction
RDSEED          *       Supports RDSEED instruction

CMOV            *       Supports CMOVcc instruction
CLFSH           *       Supports CLFLUSH instruction
CX8             *       Supports compare and exchange 8-byte instructions
CX16            *       Supports CMPXCHG16B instruction
BMI1            *       Supports bit manipulation extensions 1
BMI2            *       Supports bit manipulation extensions 2
ADX             *       Supports ADCX/ADOX instructions
DCA             -       Supports prefetch from memory-mapped device
F16C            *       Supports half-precision instruction
FXSR            *       Supports FXSAVE/FXSTOR instructions
FFXSR           -       Supports optimized FXSAVE/FSRSTOR instruction
MONITOR         -       Supports MONITOR and MWAIT instructions
MOVBE           *       Supports MOVBE instruction
ERMSB           *       Supports Enhanced REP MOVSB/STOSB
PCLMULDQ        *       Supports PCLMULDQ instruction
POPCNT          *       Supports POPCNT instruction
LZCNT           *       Supports LZCNT instruction
SEP             *       Supports fast system call instructions
LAHF-SAHF       *       Supports LAHF/SAHF instructions in 64-bit mode
HLE             -       Supports Hardware Lock Elision instructions
RTM             -       Supports Restricted Transactional Memory instructions

DE              *       Supports I/O breakpoints including CR4.DE
DTES64          -       Can write history of 64-bit branch addresses
DS              -       Implements memory-resident debug buffer
DS-CPL          -       Supports Debug Store feature with CPL
PCID            *       Supports PCIDs and settable CR4.PCIDE
INVPCID         *       Supports INVPCID instruction
PDCM            -       Supports Performance Capabilities MSR
RDTSCP          *       Supports RDTSCP instruction
TSC             *       Supports RDTSC instruction
TSC-DEADLINE    *       Local APIC supports one-shot deadline timer
TSC-INVARIANT   -       TSC runs at constant rate
xTPR            -       Supports disabling task priority messages

EIST            -       Supports Enhanced Intel Speedstep
ACPI            -       Implements MSR for power management
TM              -       Implements thermal monitor circuitry
TM2             -       Implements Thermal Monitor 2 control
APIC            *       Implements software-accessible local APIC
x2APIC          *       Supports x2APIC

CNXT-ID         -       L1 data cache mode adaptive or BIOS

MCE             *       Supports Machine Check, INT18 and CR4.MCE
MCA             *       Implements Machine Check Architecture
PBE             -       Supports use of FERR#/PBE# pin

PSN             -       Implements 96-bit processor serial number

PREFETCHW       *       Supports PREFETCHW instruction

Maximum implemented CPUID leaves: 0000000D (Basic), 80000008 (Extended).
Maximum implemented address width: 48 bits (virtual), 40 bits (physical).

Processor signature: 00050656

Logical to Physical Processor Map:
**  Physical Processor 0 (Hyperthreaded)

Logical Processor to Socket Map:
**  Socket 0

Logical Processor to NUMA Node Map:
**  NUMA Node 0

No NUMA nodes.

Logical Processor to Cache Map:
*-  Data Cache          0, Level 1,   32 KB, Assoc   8, LineSize  64
*-  Instruction Cache   0, Level 1,   32 KB, Assoc   8, LineSize  64
**  Unified Cache       0, Level 2,    4 MB, Assoc  16, LineSize  64
**  Unified Cache       1, Level 3,   16 MB, Assoc  16, LineSize  64
-*  Data Cache          1, Level 1,   32 KB, Assoc   8, LineSize  64
-*  Instruction Cache   1, Level 1,   32 KB, Assoc   8, LineSize  64

Logical Processor to Group Map:
**  Group 0
```

</details>

上記より、SSE4.2およびPOPCNT命令セットをサポートしていることが確認できました。


# Red Hat Enterprise Linux

RHELの場合はコマンドで確認することができます。OSのバージョンはRHEL 8.8を利用しました。Linuxにログインし、下記のコマンドを実行し、`flags`に対象の命令セットが含まれている項目を確認します。

```shell:実行結果
# cat /proc/cpuinfo | grep flags

flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology cpuid tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves arat pku ospke avx512_vnni md_clear arch_capabilities
```

`flags`の中に、「sse4_2」と「popcnt」が含まれていることが確認できました。


# まとめ

以上より、IBM Cloudで提供しているサーバーで該当の命令セットがサポートされていることが確認できました。これにより、IBM Cloudの仮想サーバーでTableau Serverをインストールするための要件を満たすことが可能であることがわかりました。


# 補記

上記で確認したのは「IBM CloudのVirtual Server for VPCが技術的にTableau Serverのシステム要件を満たすこと」です。そのため、この記事はSalesforce社の正式なサポートや、別環境での永続的なサポートを保証するものではありません。