নিয়ন সমর্থন

এনডিকে (NDK) এআরএম অ্যাডভান্সড সিমডি (ARM Advanced SIMD) সমর্থন করে, যা সাধারণত নিওন (Neon) নামে পরিচিত এবং এটি এআরএমভি৭ (ARMv7) ও এআরএমভি৮ (ARMv8)-এর জন্য একটি ঐচ্ছিক ইন্সট্রাকশন সেট এক্সটেনশন। নিওন স্কেলার/ভেক্টর ইন্সট্রাকশন এবং রেজিস্টার (যা এফপিইউ-এর সাথে শেয়ার করা হয়) প্রদান করে, যা এক্স৮৬ (x86) জগতের এমএমএক্স/এসএসই/থ্রিডি নাউ! (MMX/SSE/3DNow!)-এর সাথে তুলনীয়।

সমস্ত ARMv8-ভিত্তিক ("arm64") অ্যান্ড্রয়েড ডিভাইস Neon সমর্থন করে। প্রায় সমস্ত ARMv7-ভিত্তিক ("32-বিট") অ্যান্ড্রয়েড ডিভাইস Neon সমর্থন করে, যার মধ্যে API লেভেল 21 বা তার পরবর্তী সংস্করণসহ আসা সমস্ত ডিভাইসও অন্তর্ভুক্ত। NDK ডিফল্টরূপে উভয় Arm ABI-এর জন্য Neon সক্রিয় করে।

আপনি যদি খুব পুরোনো ডিভাইসগুলোকে টার্গেট করেন, তাহলে গুগল প্লে কনসোল থেকে অসামঞ্জস্যপূর্ণ ডিভাইসগুলো ফিল্টার করে বাদ দিতে পারেন। এছাড়াও, আপনার অ্যাপের কনসোল ব্যবহার করে আপনি দেখতে পারেন যে এর ফলে কতগুলো ডিভাইস প্রভাবিত হবে।

বিকল্পভাবে, সর্বোচ্চ সামঞ্জস্যের জন্য, ৩২-বিট কোড রানটাইম ডিটেকশনের মাধ্যমে নিশ্চিত করতে পারে যে টার্গেট ডিভাইসে নিওন কোড চালানো যাবে কি না। একটি অ্যাপ সিপিইউ ফিচারস- এ উল্লিখিত যেকোনো অপশন ব্যবহার করে এই চেকটি করতে পারে।

আপনার C/C++ কোডে সুস্পষ্ট Neon ইন্ট্রিনসিক লেখা উচিত নয়। Clang-এর পোর্টেবল ভেক্টর টাইপগুলো স্বয়ংক্রিয়ভাবে Neon ইনস্ট্রাকশন ব্যবহার করবে। Clang-এর Neon ইন্ট্রিনসিকগুলো আসলে পোর্টেবল টাইপগুলোর উপর একটি নন-পোর্টেবল র‍্যাপার মাত্র, তাই Neon ইন্ট্রিনসিক লিখলে আপনার কোড পোর্টেবল টাইপ ব্যবহারের চেয়ে দ্রুততর হবে না, বরং কম পোর্টেবল হবে।

নির্মাণ করুন

বিশ্বব্যাপী নিয়ন নিষ্ক্রিয় করুন

এনডিকে-বিল্ড

এনডিকে-বিল্ড বিশ্বব্যাপী নিওন নিষ্ক্রিয় করা সমর্থন করে না। একটি সম্পূর্ণ এনডিকে-বিল্ড অ্যাপ্লিকেশনে নিওন নিষ্ক্রিয় করতে, আপনার অ্যাপ্লিকেশনের প্রতিটি মডিউলে মডিউল-ভিত্তিক ধাপগুলো প্রয়োগ করুন।

CMake

CMake চালু করার সময় -DANDROID_ARM_NEON=ON পাস করুন। Android Studio/Gradle দিয়ে বিল্ড করলে, আপনার build.gradle-এ নিম্নলিখিত অপশনটি সেট করুন:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                arguments "-DANDROID_ARM_NEON=OFF"
            }
        }
    }
}

প্রতি মডিউলে নিয়ন নিষ্ক্রিয় করুন

এনডিকে-বিল্ড

Neon ছাড়া একটি ndk-build মডিউলের সমস্ত সোর্স ফাইল বিল্ড করতে, আপনার Android.mk-এর মডিউল ডেফিনিশনে নিম্নলিখিতটি যোগ করুন:

LOCAL_ARM_NEON := false

CMake

Neon ছাড়া একটি CMake টার্গেটের সমস্ত সোর্স ফাইল বিল্ড করতে, আপনার CMakeLists.txt-এ নিম্নলিখিতটি যোগ করুন:

if(ANDROID_ABI STREQUAL armeabi-v7a)
    set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS -mfpu=vfpv3-d16)
endif()

যেখানে ${TARGET} জায়গায় আপনার লাইব্রেরির নাম বসবে।

x86 এর জন্য ক্রস-প্ল্যাটফর্ম সমর্থন

NDK, থার্ড-পার্টি NEON_2_SSE.h ব্যবহারের মাধ্যমে, আপনার বিদ্যমান ARM SIMD (Neon) ইন্ট্রিনসিক ফাংশনগুলোকে x86 SSE কোডে ক্রস-প্ল্যাটফর্ম কম্পাইলেশন করতে সমর্থন করে। এই বিষয়ে আরও তথ্যের জন্য, "From ARM NEON to Intel SSE-the automatic porting solution, tips and tricks " দেখুন।

নমুনা কোড

ভেক্টরাইজেশন নমুনাটি দেখায় কিভাবে বিভিন্ন ভেক্টরাইজেশন টুল ব্যবহার করে ম্যাট্রিক্স গুণন বাস্তবায়ন করা যায় এবং সেগুলোর কর্মক্ষমতার তুলনা করা হয়।