क्या कोई फ़ंक्शन है (एसएसईएक्स इंट्रिनिक्स ठीक है) जो स्मृति को एक निर्दिष्ट int32_t
मान के साथ भर देगा?'int32_t` मान के साथ मेमोरी तेज़ कैसे भरें?
AABBCC00AABBCC00AABBCC00AABBCC00AABBCC00
AABBCC00AABBCC00AABBCC00AABBCC00AABBCC00
AABBCC00AABBCC00AABBCC00AABBCC00AABBCC00
AABBCC00AABBCC00AABBCC00AABBCC00AABBCC00
...
मैं std::fill
या के लिए लूप सरल इस्तेमाल कर सकते हैं, लेकिन यह तेजी से पर्याप्त नहीं है: उदाहरण के लिए, जब यह मान 0xAABBCC00
के बराबर है के लिए की तरह परिणाम स्मृति दिखना चाहिए।
एक सदिश कार्यक्रम की शुरुआत में केवल एक बार प्रदर्शन किया रीसाइज़िंग, यह कोई मुद्दा नहीं है। बाधा स्मृति भर रहा है।
सरलीकृत कोड:
struct X
{
typedef std::vector<int32_t> int_vec_t;
int_vec_t buffer;
X() : buffer(5000000) { /* some more action */ }
~X() { /* some code here */ }
// the following function is called 25 times per second
const int_vec_t& process(int32_t background, const SOME_DATA& data);
};
const X::int_vec_t& X::process(int32_t background, const SOME_DATA& data)
{
// the following one string takes 30% of total time of #process function
std::fill(buffer.begin(), buffer.end(), background);
// some processing
// ...
return buffer;
}
एसएसई निर्देशों का उपयोग करके आप इसे स्वयं क्यों कोड नहीं करते? आपके पास स्मृति को स्थानांतरित करने के लिए movxxxx निर्देश हैं (एक समय में 128 बिट्स)। यह केवल एक पाश और चाल है, इसे करना मुश्किल नहीं होना चाहिए। –
मैं स्वीकार करूंगा कि मैं थोड़ा उत्सुक हूं कि इसके लिए आपके उपयोग का मामला संभवतः हो सकता है जो लूप को पर्याप्त तेज़ नहीं बनाता है। क्या आप बस स्मृति की जबरदस्त ब्लॉक से निपट रहे हैं? क्या आपका मंच ब्रांचिंग में चूसता है? क्या आप इसे अक्सर एक उच्च प्रदर्शन वाले ऐप में करते हैं, जैसे गेम या कुछ? –
@Alexandre C., एसएसई निर्देश ठीक है, लेकिन मैंने सोचा कि शायद WinAPI में पहले से ही कुछ फ़ंक्शन है। मैं एक पहिया का आविष्कार नहीं करना चाहता हूं। –