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:
-
Tambahkan file header seperti arm_neon.h dan arm_sve.h untuk mendukung intrinsik ARM.
-
Ganti fungsi intrinsik tersebut. Lihat Find the Best Architecture for you di situs Arm Developer.
-
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;
}