নিচের প্রশ্নগুলোর , সম্পর্কিত তবে উত্তর বৃদ্ধ হয়েছেন, আর ব্যবহারকারীর কাছ থেকে মন্তব্য মার্ক Glisse প্রস্তাব দেওয়া এই সমস্যার যে পর্যাপ্তরূপে আলোচনা না করা যেতে পারে সি যেহেতু ++, 17 নতুন পন্থা আছে।
আমি সিমডির জন্য সঠিকভাবে কাজ করা সারিবদ্ধ করার চেষ্টা করছি, তখনও সমস্ত ডেটাতে অ্যাক্সেস রয়েছে।
ইন্টেল-এ, আমি যদি টাইপের একটি ভাসমান ভেক্টর তৈরি করি __m256
এবং 8 এর ফ্যাক্টর দ্বারা আমার আকার হ্রাস করি তবে এটি আমাকে সারিবদ্ধ মেমরি দেয়।
যেমন std::vector<__m256> mvec_a((N*M)/8);
কিছুটা হ্যাকি পদ্ধতিতে, আমি ভেক্টর উপাদানগুলিতে ভাসমানের জন্য পয়েন্টারগুলি কাস্ট করতে পারি, যা আমাকে স্বতন্ত্র ভাসমানের মানগুলিতে অ্যাক্সেস করতে দেয়।
পরিবর্তে, আমি একটি পছন্দ করতে চাই std::vector<float>
যা সঠিকভাবে প্রান্তিক করা আছে, এবং এভাবে __m256
সেগফোল্টিং ছাড়াই এবং অন্যান্য সিমডি টাইপগুলিতে লোড করা যায় ।
আমি সারিবদ্ধ_লোক অনুসন্ধান করছি ।
এটি আমাকে সি-স্টাইলের অ্যারে দিতে পারে যা সঠিকভাবে প্রান্তিকিত:
auto align_sz = static_cast<std::size_t> (32);
float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float));
তবে আমি কীভাবে এটি করতে পারি তা সম্পর্কে নিশ্চিত নই std::vector<float>
। এর std::vector<float>
মালিকানা দেওয়া marr_a
সম্ভব বলে মনে হচ্ছে না ।
আমি কিছু পরামর্শ দেখেছি যে আমার একটি কাস্টম বরাদ্দকারী লিখতে হবে , তবে এটি অনেকটা কাজের মতো মনে হচ্ছে, এবং সম্ভবত আধুনিক সি ++ এর সাথে আরও ভাল উপায় আছে?
_mm256_loadu_ps(&vec[i])
। (যদিও নোট ডিফল্ট টিউনিং বিকল্প সহ জিসিসি splits না নিশ্চিত-প্রান্তিককৃত 256-বিট লোড / দোকান vmovups XMM / vinsertf128 মধ্যে। তাই সেখানে হয় ব্যবহার করে একটি সুবিধা_mm256_load
ওভারloadu
আপনি যত্নশীল কিভাবে জিসিসি উপর আপনার কোড প্রনয়ন যদি কেউ ভুলে যায় ব্যবহার-mtune=...
বা-march=
বিকল্পগুলি))