এই প্রশ্নটি বরং পুরানো হলেও কিছু মানদণ্ডের প্রয়োজন, কারণ এটি সর্বাধিক বিড়ম্বনামূলক উপায় না বা সবচেয়ে কম সংখ্যক লাইনেই লিখতে পারে এমন উপায়ের জন্য জিজ্ঞাসা করে, তবে দ্রুততম উপায়। এবং কিছু সত্য পরীক্ষা না করেই এই প্রশ্নের উত্তর দেওয়া নির্বোধ। সুতরাং আমি চারটি সমাধানের তুলনায়, মেমসেট বনাম এসটিডি :: পূরণ কর বনাম জিরো বনাম জবাবের সমাধান বনাম একটি সমাধান আমি এভিএক্স অন্তর্দৃষ্টিগুলি ব্যবহার করে তৈরি করেছি।
মনে রাখবেন যে এই সমাধানটি জেনেরিক নয়, এটি কেবল 32 বা 64 বিটের ডেটাতে কাজ করে। দয়া করে মন্তব্য করুন যদি এই কোডটি কিছু ভুল করছে।
#include<immintrin.h>
#define intrin_ZERO(a,n){\
size_t x = 0;\
const size_t inc = 32 / sizeof(*(a));/*size of 256 bit register over size of variable*/\
for (;x < n-inc;x+=inc)\
_mm256_storeu_ps((float *)((a)+x),_mm256_setzero_ps());\
if(4 == sizeof(*(a))){\
switch(n-x){\
case 3:\
(a)[x] = 0;x++;\
case 2:\
_mm_storeu_ps((float *)((a)+x),_mm_setzero_ps());break;\
case 1:\
(a)[x] = 0;\
break;\
case 0:\
break;\
};\
}\
else if(8 == sizeof(*(a))){\
switch(n-x){\
case 7:\
(a)[x] = 0;x++;\
case 6:\
(a)[x] = 0;x++;\
case 5:\
(a)[x] = 0;x++;\
case 4:\
_mm_storeu_ps((float *)((a)+x),_mm_setzero_ps());break;\
case 3:\
(a)[x] = 0;x++;\
case 2:\
((long long *)(a))[x] = 0;break;\
case 1:\
(a)[x] = 0;\
break;\
case 0:\
break;\
};\
}\
}
আমি দাবি করব না যে এটি সবচেয়ে দ্রুত পদ্ধতি, যেহেতু আমি নিম্ন স্তরের অপ্টিমাইজেশান বিশেষজ্ঞ নই। বরং এটি একটি সঠিক আর্কিটেকচার নির্ভর বাস্তবায়নের একটি উদাহরণ যা মেমসেটের চেয়ে দ্রুত।
এখন, ফলাফলের দিকে। আমি স্ট্যাটিক এবং ডায়নামিকভাবে উভয়ই বরাদ্দকৃত আকারের 100 ইন্টি এবং দীর্ঘ দীর্ঘ অ্যারেগুলির জন্য পারফরম্যান্স গণনা করেছি, তবে এমএসভিসি ব্যতীত, যা স্ট্যাটিক অ্যারেগুলিতে একটি ডেড কোড নির্মূল করেছিল, ফলাফলগুলি অত্যন্ত তুলনীয় ছিল, তাই আমি কেবলমাত্র গতিশীল অ্যারে পারফরম্যান্স দেখাব। টাইম হ্যাঙ্কের নিম্ন নির্ভুলতা ঘড়ি ফাংশনটি ব্যবহার করে সময় চিহ্নিতকরণগুলি 1 মিলিয়ন পুনরাবৃত্তির জন্য এমএস।
ঝাঁকুনি ৩.৮ (ক্ল্যাং-ক্লার ফ্রন্টএন্ড ব্যবহার করে, অপ্টিমাইজেশান পতাকাগুলি = / ওএক্স / আর্চ: এভিএক্স / ওআই / ওটি)
int:
memset: 99
fill: 97
ZERO: 98
intrin_ZERO: 90
long long:
memset: 285
fill: 286
ZERO: 285
intrin_ZERO: 188
জিসিসি 5.1.0 (অপ্টিমাইজেশান ফ্ল্যাগস: -ও 3 -মার্চ = নেটিভ -মিটিউন = নেটিভ-ম্যাকএক্স):
int:
memset: 268
fill: 268
ZERO: 268
intrin_ZERO: 91
long long:
memset: 402
fill: 399
ZERO: 400
intrin_ZERO: 185
এমএসভিসি 2015 (অপ্টিমাইজেশন পতাকা: / ওএক্স / খিলান: এভিএক্স / ওআই / ওটি):
int
memset: 196
fill: 613
ZERO: 221
intrin_ZERO: 95
long long:
memset: 273
fill: 559
ZERO: 376
intrin_ZERO: 188
এখানে অনেক আকর্ষণীয় কাজ চলছে: এলএলভিএম কিলিং জিসিসি, এমএসভিসির টিপিকাল স্পটটি অপটিমাইজেশন (এটি স্ট্যাটিক অ্যারেগুলিতে একটি চিত্তাকর্ষক ডেড কোড নির্মূল করে এবং তারপরে পূরণের জন্য ভয়াবহ কর্মক্ষমতা রয়েছে) has যদিও আমার বাস্তবায়নটি তাত্পর্যপূর্ণভাবে দ্রুত, তবে এটি কেবল কারণ এটির স্বীকৃতি রয়েছে যে অন্য কোনও সেটিং অপারেশন থেকে বিট ক্লিয়ারিংয়ের ওভারহেড অনেক কম।
ক্ল্যাংয়ের বাস্তবায়নটি আরও তাত্পর্যপূর্ণভাবে দেখার যোগ্য, কারণ এটি উল্লেখযোগ্যভাবে দ্রুত। কিছু অতিরিক্ত টেস্টিং দেখায় যে এর মেমসেটটি আসলে শূন্যের জন্য বিশেষায়িত - 400 বাইট অ্যারের জন্য নন শূন্য মেমসেটগুলি অনেক ধীর (~ 220 মিমি) এবং গিসি এর সাথে তুলনীয়। যাইহোক, 800 বাইট অ্যারের সাথে ননজারো মেমসেটিংয়ের গতির কোনও পার্থক্য নেই, সম্ভবত এই কারণেই তাদের মেমসেটটি আমার বাস্তবায়নের চেয়ে খারাপ পারফরম্যান্স করেছে - বিশেষায়িতকরণটি কেবলমাত্র ছোট অ্যারেগুলির জন্য এবং কাটটফটি প্রায় 800 বাইটের কাছাকাছি। আরও মনে রাখবেন যে জিসিসি 'ফিল' এবং 'জিরো' মেমসেটটিকে উত্সাহিত করছে না (উত্পন্ন কোডটি দেখছে), জিসিসি কেবল অভিন্ন পারফরম্যান্সের বৈশিষ্ট্য সহ কোড উত্পন্ন করছে।
উপসংহার: মেমসেটটি এই কাজের জন্য সত্যই অনুকূলিত হয় না এবং পাশাপাশি লোকেরা এটি ভান করে (অন্যথায় জিসিসি এবং এমএসভিসি এবং এলএলভিএমের মেমসেটের একই কার্যকারিতা থাকে)। যদি পারফরম্যান্সের বিষয়টি বিবেচনা করে তবে মেমসেটটি একটি চূড়ান্ত সমাধান হওয়া উচিত নয়, বিশেষত এই বিশ্রী মাঝারি আকারের অ্যারেগুলির জন্য, কারণ এটি বিট সাফ করার জন্য বিশেষীকরণ করা হয় না এবং সংকলকটি নিজে থেকে এটি করতে পারে তার চেয়ে ভাল এটি কোনও অনুকূল নয় optim
new
হয় সি ++ ...