কোন শিরোনাম ফাইলগুলি বিভিন্ন x86 সিমডি নির্দেশ সেট এক্সটেনশনের (এমএমএক্স, এসএসই, এভিএক্স, ...) জন্য অন্তর্নিবেশ সরবরাহ করে? অনলাইনে এ জাতীয় তালিকা পাওয়া অসম্ভব বলে মনে হচ্ছে। আমি ভুল হলে শুধরে.
কোন শিরোনাম ফাইলগুলি বিভিন্ন x86 সিমডি নির্দেশ সেট এক্সটেনশনের (এমএমএক্স, এসএসই, এভিএক্স, ...) জন্য অন্তর্নিবেশ সরবরাহ করে? অনলাইনে এ জাতীয় তালিকা পাওয়া অসম্ভব বলে মনে হচ্ছে। আমি ভুল হলে শুধরে.
উত্তর:
এই দিনগুলিতে আপনার সাধারণত অন্তর্ভুক্ত হওয়া উচিত <immintrin.h>
। এর মধ্যে সমস্ত কিছু রয়েছে।
জিসিসি এবং ঝনঝন intrinsics ব্যবহার থেকে আপনাকে বন্ধ হবে নির্দেশাবলীর জন্য আপনি কম্পাইল সময়ে সক্রিয় হয় নি (সঙ্গে যেমন -march=native
বা -mavx2 -mbmi2 -mpopcnt -mfma -mcx16 -mtune=znver1
বা যাই হোক না কেন।)
এমএসভিসি এবং আইসিসি আপনাকে সংকলন সময়ে কিছু সক্ষম না করে আপনাকে অভ্যন্তরীণ ব্যবহার করতে দেবে, তবে এখনও আপনাকে অ্যাভিএক্স অভ্যন্তরীণ ব্যবহারের আগে এভিএক্স সক্ষম করা উচিত ।
Icallyতিহাসিকভাবে ( immintrin.h
সবকিছু আগে টানা আগে ) আপনাকে নিজেরাই চাইলে সর্বোচ্চ স্তরের অন্তর্ভুক্তির জন্য আপনাকে একটি শিরোনাম ম্যানুয়ালি অন্তর্ভুক্ত করতে হয়েছিল।
আপনার প্রয়োজন হয় না এমন নির্দেশ-সেট ব্যবহার করা থেকে নিজেকে আটকাতে এমএসভিসি এবং আইসিসির সাথে এটি এখনও কার্যকর হতে পারে।
<mmintrin.h> MMX
<xmmintrin.h> SSE
<emmintrin.h> SSE2
<pmmintrin.h> SSE3
<tmmintrin.h> SSSE3
<smmintrin.h> SSE4.1
<nmmintrin.h> SSE4.2
<ammintrin.h> SSE4A
<wmmintrin.h> AES
<immintrin.h> AVX, AVX2, FMA
পূর্ববর্তী সমস্তগুলিতে এই টানগুলির মধ্যে একটিও অন্তর্ভুক্ত (এএমডি-কেবল এসএসই 4 এ ব্যতীত: এটিকে টানবে immintrin.h
না)
কিছু সংকলক <zmmintrin.h>
AVX512 এর জন্যও রয়েছে।
<zmmintrin.h>
সরাসরি অন্তর্ভুক্ত করবেন না ; জিসিসি এমনকি এটি সরবরাহ করে না। শুধু ব্যবহার করুন<immintrin.h>
বা এমনকি আরও সম্পূর্ণ <x86intrin.h>
। এই উত্তরটি মূলত অপ্রচলিত, যদি না আপনি ইচ্ছাকৃতভাবে এসএসইর নতুন সংস্করণগুলির জন্য অন্তর্নিহিত অন্তর্ভুক্ত করেন তবে আপনার এসএমএস 2-র সংকলনের সময় আপনি যখন কোনও এসএসই 4.1 নির্দেশ ব্যবহার করেন তখন আপনার সংকলক অভিযোগ করে না। (জিসিসি / ঝনঝন না অভিযোগ, তাই আপনি শুধু তাদের জন্য immintrin.h ব্যবহার করা উচিত অন্যদের idk।।)
আপনি যদি কেবলমাত্র ব্যবহার করেন তবে জিসিসি / ঝনঝনিতে
#include <x86intrin.h>
এটিতে এমন সমস্ত এসএসই / এভিএক্স শিরোনাম অন্তর্ভুক্ত থাকবে যা -march=haswell
কেবল বা ঠিক এর মতো সংকলক সুইচ অনুযায়ী সক্ষম হয় -march=native
। অতিরিক্তভাবে কিছু x86 নির্দিষ্ট নির্দেশাবলীর মতো bswap
বা অন্তর্ভুক্ত ror
হিসাবে উপলভ্য হয়।
এই শিরোনামটির সমতুল্য এমএসভিসি <intrin.h>
আপনি যদি কেবল পোর্টেবল সিমডি চান তবে ব্যবহার করুন #include <immintrin.h>
এমএসভিসি, আইসিসি, এবং জিসিসি / কলং (এবং সান আমি মনে করি এমন অন্যান্য সংকলক) সকলে এই শিরোনামকে ইন্টেলের একমাত্র অন্তর্নিহিত অনুসন্ধানকারী / অনুসন্ধান সরঞ্জাম দ্বারা নথিভুক্ত সিমডি আন্তঃবিদ্যার জন্য সমর্থন করে: https://software.intel.com/sites/landingpage/IntrinsicsGuide /
<x86intrin.h>
, তবে <intrin.h>
অনুরূপ প্রভাব অর্জন করে। অবশ্যই আপনার এখনও অবশ্যই শর্তসাপেক্ষ সংকলন প্রয়োজন। :-(
#include <immintrin.h>
। সিমডি অন্তর্ভুক্তির জন্য এটি ব্যবহার করুন। আপনার কেবলমাত্র বৃহত্তর (এবং সংকলকটির তুলনায় কিছুটা ধীর গতিতে) প্রয়োজন হবে x86intrin.h
বা আপনার intrin.h
যদি পূর্ণসংখ্যার ঘোরানো / বিট-স্ক্যান ইন্টারসনিক্সের মতো জিনিসগুলির প্রয়োজন হয় (যদিও ইন্টেল immintrin.h
তাদের কিছু অন্তর্নিদর্শক গাইড হিসাবে উপলব্ধ হিসাবে নথি রয়েছে )।
x86intrin.h
/ intrin.h
কিন্তু না এ immintrin.h
।
শিরোনামের নামটি আপনার সংকলক এবং লক্ষ্য আর্কিটেকচারের উপর নির্ভর করে।
intrin.h
x86intrin.h
arm_neon.h
mmintrin.h
altivec.h
spe.h
আপনি শর্তসাপেক্ষ প্রাকপ্রসেসিং নির্দেশাবলী সহ এই সমস্ত কেস পরিচালনা করতে পারেন:
#if defined(_MSC_VER)
/* Microsoft C/C++-compatible compiler */
#include <intrin.h>
#elif 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>
#elif defined(__GNUC__) && defined(__IWMMXT__)
/* GCC-compatible compiler, targeting ARM with WMMX */
#include <mmintrin.h>
#elif (defined(__GNUC__) || defined(__xlC__)) && (defined(__VEC__) || defined(__ALTIVEC__))
/* XLC or GCC-compatible compiler, targeting PowerPC with VMX/VSX */
#include <altivec.h>
#elif defined(__GNUC__) && defined(__SPE__)
/* GCC-compatible compiler, targeting PowerPC with SPE */
#include <spe.h>
#endif
এই পৃষ্ঠা থেকে
+----------------+------------------------------------------------------------------------------------------+
| Header | Purpose |
+----------------+------------------------------------------------------------------------------------------+
| x86intrin.h | Everything, including non-vector x86 instructions like _rdtsc(). |
| mmintrin.h | MMX (Pentium MMX!) |
| mm3dnow.h | 3dnow! (K6-2) (deprecated) |
| xmmintrin.h | SSE + MMX (Pentium 3, Athlon XP) |
| emmintrin.h | SSE2 + SSE + MMX (Pentium 4, Athlon 64) |
| pmmintrin.h | SSE3 + SSE2 + SSE + MMX (Pentium 4 Prescott, Athlon 64 San Diego) |
| tmmintrin.h | SSSE3 + SSE3 + SSE2 + SSE + MMX (Core 2, Bulldozer) |
| popcntintrin.h | POPCNT (Nehalem (Core i7), Phenom) |
| ammintrin.h | SSE4A + SSE3 + SSE2 + SSE + MMX (AMD-only, starting with Phenom) |
| smmintrin.h | SSE4_1 + SSSE3 + SSE3 + SSE2 + SSE + MMX (Penryn, Bulldozer) |
| nmmintrin.h | SSE4_2 + SSE4_1 + SSSE3 + SSE3 + SSE2 + SSE + MMX (Nehalem (aka Core i7), Bulldozer) |
| wmmintrin.h | AES (Core i7 Westmere, Bulldozer) |
| immintrin.h | AVX, AVX2, AVX512, all SSE+MMX (except SSE4A and XOP), popcnt, BMI/BMI2, FMA |
+----------------+------------------------------------------------------------------------------------------+
সুতরাং সাধারণভাবে আপনি কেবল immintrin.h
সমস্ত ইনটেল এক্সটেনশনগুলি অন্তর্ভুক্ত করতে পারেন, বা x86intrin.h
যদি আপনি সমস্ত কিছু চান _bit_scan_forward
এবং এর _rdtsc
পাশাপাশি সমস্ত ভেক্টর অন্তর্নিহিতগুলিতে কেবলমাত্র এএমডি রয়েছে include আপনার যদি প্রয়োজন আরও বেশি কিছু অন্তর্ভুক্ত থাকে তবে আপনি টেবিলটি দেখে ডানটি অন্তর্ভুক্ত করতে পারেন।
x86intrin.h
এটিএমডি এক্সওপি (কেবলমাত্র বুলডোজার-এর, এমনকি ভবিষ্যতের এএমডি সিপিইউগুলি নয়) এর নিজস্ব অন্তর্ভুক্তির চেয়ে অন্তর্নিহিতগুলি পাওয়ার প্রস্তাবিত উপায় ।
কিছু সংকলক এখনও ত্রুটি বার্তা উত্পন্ন করবে যদি আপনি সক্ষম না করেন এমন নির্দেশ-সেটগুলির জন্য অন্তর্নিহিত ব্যবহার করেন (যেমন _mm_fmadd_ps
, আপনি এভিএক্স 2 অন্তর্ভুক্ত immintrin.h
এবং সক্ষম করেও एफএমএ সক্ষম না করে)।
smmintrin
(এসএসই 4.1) পেনেরিন (45nm কোর 2), নেহালেম নয় ("আই 7")। আমরা কি "i7" কে আর্কিটেকচারের নাম হিসাবে ব্যবহার বন্ধ করতে পারি? এটি এখন অর্থহীন যে ইন্টেল এটি এসএনবি-পরিবারের জন্য ব্যবহার করে চলেছে ।
immintrin.h
জিসিসি 9.1.0 এ অন্তর্ভুক্ত _popcnt32
এবং _popcnt64
(তাদের সাথে বিভ্রান্ত হওয়ার দরকার নেই popcntintrin.h
) অন্তর্ভুক্ত বলে মনে হচ্ছে না । সুতরাং এটি x86intrin.h
এখনও একটি উদ্দেশ্য কাজ করে প্রদর্শিত হয় ।
হিসাবে উত্তর এবং মন্তব্য অনেক বিবৃত করেছি, <x86intrin.h>
হয় এক্স 86 [-64] SIMD intrinsics জন্য ব্যাপক হেডার। এটি অন্যান্য আইএসএ এক্সটেনশনের জন্য অন্তর্নিহিত সমর্থনকারী নির্দেশাবলীও সরবরাহ করে। , এবং সমস্ত এটি স্থির করেছেন। শিরোনামটি সমর্থন করে এমন সংস্করণগুলিতে আমার কিছু খনন করা দরকার ছিল এবং আমি মনে করি যে এটি কিছু অনুসন্ধানের তালিকা তৈরি করা কার্যকর হতে পারে ...gcc
clang
icc
জিসিসি : x86intrin.h
প্রথমটির জন্য সমর্থন উপস্থিত হয় gcc-4.5.0
। gcc-4
মুক্তি সিরিজ আর বজায় হচ্ছে, যখন gcc-6.x
হয় বর্তমান স্থিতিশীল রিলিজ সিরিজ। সমস্ত প্রকাশে উপস্থিত এক্সটেনশনটিও gcc-5
চালু করে । প্রাক-রিলিজে রয়েছে (রিগ্রেশন টেস্টিং ইত্যাদি) এবং বর্তমান সংস্করণ প্রকল্পটি অনুসরণ করে হিসাবে প্রকাশিত হবে ।__has_include
clang-3.x
gcc-7
gcc-7.1.0
ঝাঁকুনি : x86intrin.h
সমস্ত clang-3.x
প্রকাশের জন্য সমর্থিত বলে মনে হচ্ছে । সর্বশেষ স্থিতিশীল রিলিজ হয় clang (LLVM) 3.9.1
। উন্নয়ন শাখা হ'ল clang (LLVM) 5.0.0
। এটি 4.x
সিরিজের কী হয়েছে তা পরিষ্কার নয় ।
অ্যাপল বিড়ম্বনা : বিরক্তিকরভাবে, অ্যাপলের সংস্করণ LLVM
প্রকল্পগুলির সাথে সামঞ্জস্য করে না । এটি বলেছিল, বর্তমান প্রকাশ:, clang-800.0.42.1
ভিত্তিক LLVM 3.9.0
। প্রথম LLVM 3.0
ভিত্তিক সংস্করণটি Apple clang 2.1
আবার ফিরে আসবে বলে মনে হচ্ছে Xcode 4.1
। LLVM 3.1
প্রথমে Apple clang 3.1
(একটি সংখ্যার কাকতালীয়) এর সাথে উপস্থিত হয় Xcode 4.3.3
।
অ্যাপল __apple_build_version__
যেমন উদাহরণস্বরূপ 8000042
,। এটি উপলব্ধ সবচেয়ে স্থিতিশীল, কঠোরভাবে আরোহী সংস্করণ উপলব্ধ স্কিম সম্পর্কে। আপনি যদি লিগ্যাসি সংকলকগুলিকে সমর্থন করতে না চান তবে এই মানগুলির মধ্যে একটি ন্যূনতম প্রয়োজনীয়তা তৈরি করুন।
clang
অ্যাপল সংস্করণ সহ সাম্প্রতিক যে কোনও সংস্করণে কোনও সমস্যা নেই x86intrin.h
। অবশ্যই, পাশাপাশি gcc-5
, আপনি সর্বদা নিম্নলিখিত ব্যবহার করতে পারেন:
#if defined (__has_include) && (__has_include(<x86intrin.h>))
#include <x86intrin.h>
#else
#error "upgrade your compiler. it's free..."
#endif
যে কৌশলটি আপনি সত্যিই নির্ভর করতে পারবেন না তা হ'ল __GNUC__
সংস্করণগুলি ব্যবহার করে clang
। সংস্করণটি historicalতিহাসিক কারণে, আটকে আছে 4.2.1
। x86intrin.h
শিরোনামের আগে একটি সংস্করণ । এটি মাঝে মাঝে সহজ জিএনইউ সি এক্সটেনশনের জন্য দরকারী যা পিছনের দিকে সামঞ্জস্যপূর্ণ রয়েছে।
আইসিসি : যতদূর আমি বলতে পারি, শিরোনামটিx86intrin.h
অন্তত ইনটেল সি ++ 16.0 থেকে সমর্থিত। সংস্করণের পরীক্ষায় দ্বারা সঞ্চালিত করতে পারেন: #if (__INTEL_COMPILER >= 1600)
। এই সংস্করণটি (এবং সম্ভবত পূর্ববর্তী সংস্করণগুলি) __has_include
এক্সটেনশনের জন্য সমর্থন সরবরাহ করে ।
এমএসভিসি : এটি শিরোনাম সরবরাহ MSVC++ 12.0 (Visual Studio 2013)
করার জন্য এটি প্রথম সংস্করণ হিসাবে উপস্থিত হয় intrin.h
- নয় x86intrin.h
... এটি প্রস্তাবিত: #if (_MSC_VER >= 1800)
সংস্করণ পরীক্ষা হিসাবে। অবশ্যই, আপনি যদি এই সমস্ত বিভিন্ন সংকলক জুড়ে পোর্টেবল এমন কোডটি লেখার চেষ্টা করছেন তবে এই প্ল্যাটফর্মের শিরোনামের নামটি আপনার সমস্যার মধ্যে সবচেয়ে কম হবে।
#include <x86intrin.h>
যা করতে পারেন তা যা আপনার প্রয়োজনীয় সমস্ত কিছু টানতে পারে ।