Foundationপ্রথম নীতি থেকে
LEVEL 11 · Advanced Architecture & Performance

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-এ সামগ্রিক গতি কমিয়েও দিতে পারে।