All Products
Search
Document Center

Elastic Compute Service:Migrasi kode C atau C++

Last Updated:Apr 28, 2026

Modifikasi makro, fungsi bawaan, intrinsik, dan inline assembly agar perangkat lunak C atau C++ dapat dikompilasi ulang pada Instance ECS YiTian.

Macros

Makro sistem berbeda tergantung platform. Tabel berikut mencantumkan makro yang didefinisikan untuk platform berbasis ARM, platform x86, dan keduanya.

Macro for ARM-based platforms

Macro for x86 platforms

Macro for both x86 and ARM-based platforms

__arm__

__amd64__

__STDC_HOSTED__

__thumb__

i386

__INT64_TYPE__

__ARM_ARCH_4T__

__k8__

_LP64

__aarch64__

__SSE2__

__WCHAR_MAX__

Built-in functions

Fungsi bawaan GCC (dengan awalan __builtin_) yang ditujukan untuk platform x86, seperti __builtin_ia32_xxx, mungkin gagal dikompilasi pada instance YiTian.

Ganti fungsi bawaan spesifik x86 dengan padanan ARM-nya. Sebagai contoh, ubah __builtin_ia32_crc32qi(a, b) yang terkait CRC menjadi __builtin_aarch64_crc32cb(a, b).

Intrinsic functions

Fungsi intrinsik memanggil operasi SIMD yang terikat pada arsitektur CPU x86. Migrasi intrinsik SIMD merupakan fokus utama saat memindahkan perangkat lunak ke instance YiTian.

Untuk melakukan migrasi fungsi intrinsik dari platform x86 ke instance YiTian:

  1. Tambahkan file header seperti arm_neon.h dan arm_sve.h untuk mendukung intrinsik ARM.

  2. Ganti fungsi intrinsik tersebut. Lihat Find the Best Architecture for you di situs Arm Developer.

Catatan
  • Pada langkah-langkah sebelumnya, modifikasi set instruksi dan tipe data untuk platform berbasis ARM. Contoh:

    • Ubah __m128 mm_load_ps (x86) menjadi float32x4_t vld1q_f32 (ARM).

    • Set instruksi x86 AVX menggunakan register 256-bit, sedangkan AArch64 hanya mendukung register 128-bit. Perluas instruksi tersebut dengan semantik yang setara; misalnya, ganti m256d mm_add_ps dengan dua instruksi SIMD vaddq_f32 pada AArch64.

  • Instance YiTian mendukung instruksi SVE, tetapi intrinsik SVE tidak disarankan karena mode pemrogramannya yang khusus. Gunakan proyek open source seperti sse2neon sebagai gantinya.

Inline assembly

Ganti instruksi assembly x86 dengan padanan AArch64 yang memiliki semantik sama. Sebagai contoh, ubah asm("bswap %0" : "=r"(val) : "0"(val)) menjadi asm("rev %[dst], %[src]" : [dst] "=r"(val) : [src] "r"(val)). Lihat How to Use Inline Assembly Language in C Code.

Sample code

Contoh berikut menunjukkan cara memodifikasi kode C atau C++ untuk migrasi dari x86 ke instance YiTian:

Code before modification:

#if defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__))
/* GCC-compatible compiler, targeting x86/x86-64 */
#include <x86intrin.h>
#endif
uint32_t crc32_4k(uint32_t acc, char* buf) {
    for (char* end = buf + 4096; buf < end; buf += 4) {
        acc = __builtin_ia32_crc32si(acc, *(uint32_t*)buf);
    }
    return acc;
}

Code after modification:

#if defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__))
     /* GCC-compatible compiler, targeting x86/x86-64 */
     #include <x86intrin.h>
#elif defined(__GNUC__) && defined(__ARM_NEON)
     /* GCC-compatible compiler, targeting ARM with NEON */
     #include <arm_neon.h>
  #if defined(__ARM_FEATURE_SVE)
     #include <arm_sve.h>
  #endif 
#endif

uint32_t crc32_4k(uint32_t acc, char* buf) {
    for (char* end = buf + 4096; buf < end; buf += 4) {
        acc = __builtin_aarch64_crc32cw(acc, *(uint32_t*)buf);
    }
    return acc;
}