X86 সিমডি অন্তর্ভুক্তির জন্য শিরোনাম ফাইল


131

কোন শিরোনাম ফাইলগুলি বিভিন্ন x86 সিমডি নির্দেশ সেট এক্সটেনশনের (এমএমএক্স, এসএসই, এভিএক্স, ...) জন্য অন্তর্নিবেশ সরবরাহ করে? অনলাইনে এ জাতীয় তালিকা পাওয়া অসম্ভব বলে মনে হচ্ছে। আমি ভুল হলে শুধরে.

উত্তর:


174

এই দিনগুলিতে আপনার সাধারণত অন্তর্ভুক্ত হওয়া উচিত <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 এর জন্যও রয়েছে।


62
বা আপনি #include <x86intrin.h>যা করতে পারেন তা যা আপনার প্রয়োজনীয় সমস্ত কিছু টানতে পারে ।
পল আর

2
zmmintrin.h এর AVX-512 অন্তর্নিহিত রয়েছে।
onitake

3
এসএসই 3 / এসএসএসই 3 / এসএসই 4.1 এবং 4.2 এর জন্য পি, টি, এস এবং এন কেন? এই চরিত্রগুলি কী উপস্থাপন করে?
ফুক্লভ

5
@ LưuVĩnhPhúc SSE3 = নতুন নির্দেশাবলী, এসএসএসই 3 = তেজাস নতুন নির্দেশাবলী। আমার মনে হয় এসএসই ৪.২ এবং এএসএস তাদের প্রসেসর পরিবারকে বোঝায় যেগুলি তাদের (নেহালেম এবং ওয়েস্টমিয়ার)
ড্রইউ ম্যাকগোভেন

14
<zmmintrin.h>সরাসরি অন্তর্ভুক্ত করবেন না ; জিসিসি এমনকি এটি সরবরাহ করে না। শুধু ব্যবহার করুন<immintrin.h> বা এমনকি আরও সম্পূর্ণ <x86intrin.h>। এই উত্তরটি মূলত অপ্রচলিত, যদি না আপনি ইচ্ছাকৃতভাবে এসএসইর নতুন সংস্করণগুলির জন্য অন্তর্নিহিত অন্তর্ভুক্ত করেন তবে আপনার এসএমএস 2-র সংকলনের সময় আপনি যখন কোনও এসএসই 4.1 নির্দেশ ব্যবহার করেন তখন আপনার সংকলক অভিযোগ করে না। (জিসিসি / ঝনঝন না অভিযোগ, তাই আপনি শুধু তাদের জন্য immintrin.h ব্যবহার করা উচিত অন্যদের idk।।)
পিটার Cordes

76

আপনি যদি কেবলমাত্র ব্যবহার করেন তবে জিসিসি / ঝনঝনিতে

#include <x86intrin.h>

এটিতে এমন সমস্ত এসএসই / এভিএক্স শিরোনাম অন্তর্ভুক্ত থাকবে যা -march=haswellকেবল বা ঠিক এর মতো সংকলক সুইচ অনুযায়ী সক্ষম হয় -march=native। অতিরিক্তভাবে কিছু x86 নির্দিষ্ট নির্দেশাবলীর মতো bswapবা অন্তর্ভুক্ত rorহিসাবে উপলভ্য হয়।


এই শিরোনামটির সমতুল্য এমএসভিসি <intrin.h>


আপনি যদি কেবল পোর্টেবল সিমডি চান তবে ব্যবহার করুন #include <immintrin.h>

এমএসভিসি, আইসিসি, এবং জিসিসি / কলং (এবং সান আমি মনে করি এমন অন্যান্য সংকলক) সকলে এই শিরোনামকে ইন্টেলের একমাত্র অন্তর্নিহিত অনুসন্ধানকারী / অনুসন্ধান সরঞ্জাম দ্বারা নথিভুক্ত সিমডি আন্তঃবিদ্যার জন্য সমর্থন করে: https://software.intel.com/sites/landingpage/IntrinsicsGuide /


আমি নিশ্চিত ছিলাম না, যদি নতুন সংস্করণগুলি হতে পারে ... যাইহোক, যতক্ষণ পর্যন্ত জিসিসি, আইসিসি এবং ঝনঝন রয়েছে এটি ব্যবহার করা ঠিক আছে আমি মনে করি :-)
গুন্থার পাইজ

5
এমএসভিসি এর নেই <x86intrin.h>, তবে <intrin.h>অনুরূপ প্রভাব অর্জন করে। অবশ্যই আপনার এখনও অবশ্যই শর্তসাপেক্ষ সংকলন প্রয়োজন। :-(
কোডি গ্রে

সমস্ত বড় x86 সংকলক রয়েছে #include <immintrin.h>। সিমডি অন্তর্ভুক্তির জন্য এটি ব্যবহার করুন। আপনার কেবলমাত্র বৃহত্তর (এবং সংকলকটির তুলনায় কিছুটা ধীর গতিতে) প্রয়োজন হবে x86intrin.hবা আপনার intrin.hযদি পূর্ণসংখ্যার ঘোরানো / বিট-স্ক্যান ইন্টারসনিক্সের মতো জিনিসগুলির প্রয়োজন হয় (যদিও ইন্টেল immintrin.h তাদের কিছু অন্তর্নিদর্শক গাইড হিসাবে উপলব্ধ হিসাবে নথি রয়েছে )।
পিটার কর্ডেস

IIRC, কিছু অ SIMD intrinsics immintrin.h হচ্ছে হিসাবে যা ইন্টেল দস্তাবেজ, কিন্তু যা জিসিসি, ঝনঝন শব্দ, এবং / অথবা MSVC শুধুমাত্র আছে x86intrin.h/ intrin.hকিন্তু নাimmintrin.h
পিটার কর্ডেস

56

শিরোনামের নামটি আপনার সংকলক এবং লক্ষ্য আর্কিটেকচারের উপর নির্ভর করে।

  • মাইক্রোসফ্ট সি ++ (x86, x86-64 বা এআরএম লক্ষ্য করে) এবং উইন্ডোজ ব্যবহারের জন্য ইন্টেল সি / সি ++ সংকলক intrin.h
  • জিসিসি / কলং / আইসিসি টার্গেটিং x86 / x86-64 ব্যবহারের জন্য x86intrin.h
  • জিসিসি / কলং / আর্মসিসি নিওন ব্যবহারের সাথে এআরএম লক্ষ্যবস্তু করে arm_neon.h
  • জিসিসি / কলং / আর্মসিসি জন্য ডাব্লুএমএমএক্স ব্যবহারের সাথে এআরএম লক্ষ্য করে mmintrin.h
  • ভিসিএক্স (ওরফে অ্যালভেটিভ) এবং / অথবা ভিএসএক্স ব্যবহারের সাথে জিপিসি / কলং / এক্সএলসিসি পাওয়ারপিসি লক্ষ্য করে altivec.h
  • জিপিসি / ঝনঝন স্পি ব্যবহারের সাথে পাওয়ারপিসি লক্ষ্য করে target 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

আপনার তালিকায় যোগ করার জন্য এখানে আরও কিছু রয়েছে: জিসিসি সহ আল্ট্রাসারপ্যাক + ভিআইএসে, ভিসিনট্রিন.ইচ ব্যবহার করুন; আপনার যদি সূর্যের ভিএসডিকে থাকে তবে ভিস এইচ একটি আলাদা সেট অন্তর্ভুক্ত করে। দলিল এখানে পাওয়া যাবে: সান ভিআইএস ব্যবহারকারীর গাইড , জিসিসি ভিআইএস বিল্টইনস
onitake

44

এই পৃষ্ঠা থেকে

+----------------+------------------------------------------------------------------------------------------+
|     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এবং সক্ষম করেও एफএমএ সক্ষম না করে)।


1
smmintrin(এসএসই 4.1) পেনেরিন (45nm কোর 2), নেহালেম নয় ("আই 7")। আমরা কি "i7" কে আর্কিটেকচারের নাম হিসাবে ব্যবহার বন্ধ করতে পারি? এটি এখন অর্থহীন যে ইন্টেল এটি এসএনবি-পরিবারের জন্য ব্যবহার করে চলেছে
পিটার কর্ডস

immintrin.hজিসিসি 9.1.0 এ অন্তর্ভুক্ত _popcnt32এবং _popcnt64(তাদের সাথে বিভ্রান্ত হওয়ার দরকার নেই popcntintrin.h) অন্তর্ভুক্ত বলে মনে হচ্ছে না । সুতরাং এটি x86intrin.hএখনও একটি উদ্দেশ্য কাজ করে প্রদর্শিত হয় ।
থম উইগার্স

12

হিসাবে উত্তর এবং মন্তব্য অনেক বিবৃত করেছি, <x86intrin.h>হয় এক্স 86 [-64] SIMD intrinsics জন্য ব্যাপক হেডার। এটি অন্যান্য আইএসএ এক্সটেনশনের জন্য অন্তর্নিহিত সমর্থনকারী নির্দেশাবলীও সরবরাহ করে। , এবং সমস্ত এটি স্থির করেছেন। শিরোনামটি সমর্থন করে এমন সংস্করণগুলিতে আমার কিছু খনন করা দরকার ছিল এবং আমি মনে করি যে এটি কিছু অনুসন্ধানের তালিকা তৈরি করা কার্যকর হতে পারে ...gccclangicc

  • জিসিসি : x86intrin.hপ্রথমটির জন্য সমর্থন উপস্থিত হয় gcc-4.5.0gcc-4মুক্তি সিরিজ আর বজায় হচ্ছে, যখন gcc-6.xহয় বর্তমান স্থিতিশীল রিলিজ সিরিজ। সমস্ত প্রকাশে উপস্থিত এক্সটেনশনটিও gcc-5চালু করে । প্রাক-রিলিজে রয়েছে (রিগ্রেশন টেস্টিং ইত্যাদি) এবং বর্তমান সংস্করণ প্রকল্পটি অনুসরণ করে হিসাবে প্রকাশিত হবে ।__has_includeclang-3.xgcc-7gcc-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.1LLVM 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.1x86intrin.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)সংস্করণ পরীক্ষা হিসাবে। অবশ্যই, আপনি যদি এই সমস্ত বিভিন্ন সংকলক জুড়ে পোর্টেবল এমন কোডটি লেখার চেষ্টা করছেন তবে এই প্ল্যাটফর্মের শিরোনামের নামটি আপনার সমস্যার মধ্যে সবচেয়ে কম হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.