AVX
এভিএক্স
Advanced Vector Extensions — x86-64-এর ২৫৬-bit (AVX2) বা ৫১২-bit (AVX-512) SIMD instruction set, C/C++ থেকে intrinsics ফাংশন দিয়ে সরাসরি ব্যবহারযোগ্য (যেমন _mm256_add_ps)।
also: AVX2, AVX-512, SIMD intrinsics, __m256, YMM
Intrinsics একটা C ফাংশনের মতো দেখতে কিন্তু সরাসরি একটা নির্দিষ্ট
hardware instruction-এ compile হয় — __m256 টাইপ একটা ২৫৬-bit
YMM register-কে প্রতিনিধিত্ব করে (৮টা float)। মূল প্যাটার্ন সবসময়
load → compute → store:
__m256 va = _mm256_loadu_ps(&a[i]);
__m256 vb = _mm256_loadu_ps(&b[i]);
_mm256_storeu_ps(&c[i], _mm256_add_ps(va, vb));
loadu/storeu (u = unaligned) সাধারণত নিরাপদ ডিফল্ট — কখনো
fault করে না। _mm256_load_ps (aligned) ৩২-byte boundary দাবি
করে, না মানলে crash করে; Nehalem-পরবর্তী hardware-এ speed পার্থক্য
প্রায় নগণ্য যদি ঠিকানা এমনিতেই aligned থাকে।
সীমাবদ্ধতা: ডেটা contiguous হতে হয় (তাই AoS বনাম SoA
একটা বাস্তব পূর্বশর্ত প্রশ্ন — struct-এর ভেতরের interleaved field
সরাসরি vectorize করা যায় না)। Horizontal reduction (lane-এর ভেতরে
যোগফল বের করা) awkward — AVX2-তে ৬টা instruction লাগে যেখানে
per-lane addition মাত্র ১টা, কারণ hardware lane independence-এর
জন্য optimize করা, cross-lane routing-এর জন্য না। ARM NEON-এ
তুলনায় vaddvq_f32 নামের একটা dedicated instruction একই কাজ এক
call-এই করে — সীমাবদ্ধতা ISA-নির্দিষ্ট, সার্বজনীন না।
AVX-512-এর একটা কুখ্যাত সমস্যা — কিছু Intel CPU-তে ব্যবহারে CPU frequency throttle করে, mixed workload-এ সামগ্রিক গতি কমিয়েও দিতে পারে।