প্রথমত, আপনার এই সত্য সম্পর্কে সচেতন হওয়া উচিত যে সিউডিএ স্বয়ংক্রিয়ভাবে কম্পিউটারগুলি দ্রুত তৈরি করবে না। এক দিকে, কারণ জিপিইউ প্রোগ্রামিং একটি শিল্প, এবং এটা খুব হতে পারে, খুব এটি পেতে চ্যালেঞ্জ অধিকার । অন্যদিকে, কারণ জিপিইউগুলি কেবলমাত্র নির্দিষ্ট ধরণের গণনার জন্য উপযুক্ত suited
এটি বিভ্রান্তিকর শব্দ হতে পারে কারণ আপনি জিপিইউতে মূলত যে কোনও কিছু গণনা করতে পারেন । মূল বিষয়টি হ'ল আপনি অবশ্যই একটি ভাল স্পিডআপ অর্জন করবেন কিনা। এখানে সর্বাধিক গুরুত্বপূর্ণ শ্রেণিবিন্যাস হ'ল সমস্যাটি সমান্তরাল কাজ কিনা বা ডেটা সমান্তরাল । প্রথমটি মোটামুটিভাবে বলতে সমস্যাগুলি বোঝায় যেখানে বেশ কয়েকটি থ্রেড তাদের নিজের কাজগুলিতে কমবেশি স্বতন্ত্রভাবে কাজ করছে। দ্বিতীয়টি এমন সমস্যাগুলিকে বোঝায় যেখানে অনেক থ্রেড সব একই রকম হয় - তবে ডেটার বিভিন্ন অংশে।
দ্বিতীয়টি হ'ল জিপিইউতে যে ধরণের সমস্যা রয়েছে তা হ'ল: তাদের অনেকগুলি কর রয়েছে এবং সমস্ত কোর একই কাজ করে তবে ইনপুট ডেটার বিভিন্ন অংশে কাজ করে।
আপনি উল্লেখ করেছেন যে আপনার কাছে "সাধারণ গণিত তবে বিপুল পরিমাণে ডেটা" রয়েছে। যদিও এটি পুরোপুরি ডেটা সমান্তরাল সমস্যার মতো মনে হতে পারে এবং এটি জিপিইউয়ের জন্য এটি যথাযথভাবে উপযোগী ছিল, তবে এর আরও একটি দিক বিবেচনা করতে হবে: জিপিইউগুলি তাত্ত্বিক গণনা শক্তি (এফএলপিএস, প্রতি সেকেন্ডে ফ্লোটিং পয়েন্ট অপারেশন) এর দিক থেকে হাস্যকরভাবে দ্রুত are তবে তারা প্রায়শই মেমোরি ব্যান্ডউইদথ দ্বারা থ্রটল হয়ে থাকে।
এটি সমস্যার আরেকটি শ্রেণিবিন্যাসের দিকে নিয়ে যায়। যথা সমস্যাগুলি স্মৃতিশ্রেণীতে আবদ্ধ কিনা বা গণনা সীমাবদ্ধ ।
প্রথমটি সেই সমস্যাগুলিকে বোঝায় যেখানে প্রতিটি ডেটা উপাদানগুলির জন্য করা নির্দেশাবলীর সংখ্যা কম। উদাহরণস্বরূপ, একটি সমান্তরাল ভেক্টর সংযোজন বিবেচনা করুন: আপনাকে পড়তে হবে দুটি তথ্য উপাদান হবে, তারপরে একটি একক সংযোজন করতে হবে, এবং তারপরে ফলাফল ভেক্টরে যোগফল লিখতে হবে। জিপিইউতে এটি করার সময় আপনি একটি স্পিডআপ দেখতে পাবেন না, কারণ একক সংযোজন মেমরিটি পড়ার / লেখার প্রচেষ্টার ক্ষতিপূরণ দেয় না।
দ্বিতীয় পরিভাষা, "কম্পিউট বাউন্ড" বলতে সমস্যাগুলি বোঝায় যেখানে মেমরি পড়ার / লেখার সংখ্যার তুলনায় নির্দেশাবলীর সংখ্যা বেশি। উদাহরণস্বরূপ, একটি ম্যাট্রিক্সের গুণকে বিবেচনা করুন: নির্দেশিকাগুলির সংখ্যা হ'ল (n) 3) হবে যখন n ম্যাট্রিক্সের আকার হবে। এই ক্ষেত্রে, কেউ আশা করতে পারেন যে জিপিইউ একটি নির্দিষ্ট ম্যাট্রিক্স আকারে সিপিইউকে ছাড়িয়ে যাবে। অন্য কয়েকটি উদাহরণ হতে পারে যখন "কয়েকটি" ডেটা উপাদানগুলিতে অনেকগুলি জটিল ত্রিকোণমিতিক গণনা (সাইন / কোসাইন ইত্যাদি) সঞ্চালিত হয়।
থাম্বের নিয়ম হিসাবে: আপনি ধরে নিতে পারেন যে "মেইন" জিপিইউ মেমরি থেকে একটি ডেটা উপাদান পড়ার / লেখার প্রায় 500 নির্দেশাবলীর প্রচ্ছন্নতা রয়েছে ....
অতএব, জিপিইউগুলির পারফরম্যান্সের জন্য আরেকটি মূল বিষয় হ'ল ডেটা লোকালটি : যদি আপনাকে ডেটা পড়তে বা লিখতে হয় (এবং বেশিরভাগ ক্ষেত্রে আপনাকে ;-) করতে হবে) তবে আপনার অবশ্যই নিশ্চিত করা উচিত যে ডেটাটি যতটা কাছাকাছি রাখা হয়েছে জিপিইউ কোরগুলির পক্ষে সম্ভব। জিপিইউগুলিতে কিছু নির্দিষ্ট মেমরি অঞ্চল থাকে ("লোকাল মেমরি" বা "শেয়ার্ড মেমোরি" হিসাবে পরিচিত) সাধারণত আকারে কয়েক কেবি থাকে তবে কোনও গণনার সাথে জড়িত হতে পারে এমন ডেটার জন্য বিশেষভাবে দক্ষ।
সুতরাং এটি আবার জোর দেওয়া: জিপিইউ প্রোগ্রামিং একটি শিল্প, এটি কেবলমাত্র সিপিইউতে সমান্তরাল প্রোগ্রামিংয়ের সাথে সম্পর্কিত। জাভা টপিক ভালো জিনিস, মত সব সম্পাতবিন্দু পরিকাঠামোর সঙ্গে ThreadPoolExecutors
, ForkJoinPools
ইত্যাদি ছাপ আপনি শুধু আপনার কাজ একরকম বিভক্ত এবং বিভিন্ন প্রসেসর মধ্যে এটি বিতরণ করা আছে দিতে পারে। জিপিইউতে আপনি অনেক নিচু স্তরে চ্যালেঞ্জের মুখোমুখি হতে পারেন: দখল, রেজিস্ট্রার চাপ, ভাগ করা মেমরি প্রেসার, মেমরি কোলেসেসিং ... কেবল কয়েকটি নাম রাখার জন্য।
তবে, যখন আপনার সমাধানের জন্য কোনও ডেটা সমান্তরাল, গণনা-সীমাবদ্ধ সমস্যা রয়েছে, জিপিইউ হ'ল উপায়।
একটি সাধারণ মন্তব্য: আপনার বিশেষভাবে CUDA এর জন্য জিজ্ঞাসা করা হয়েছিল। তবে আমি আপনাকে দৃ Open়ভাবে ওপেনসিএল দেখার জন্য সুপারিশ করব। এর বিভিন্ন সুবিধা রয়েছে। প্রথমত, এটি একটি বিক্রেতা-স্বাধীন, মুক্ত শিল্প মান, এবং এএমডি, অ্যাপল, ইন্টেল এবং এনভিআইডিআইএ দ্বারা ওপেনসিএল এর বাস্তবায়ন রয়েছে। অতিরিক্তভাবে, জাভা বিশ্বে ওপেনসিএল-এর জন্য অনেক বিস্তৃত সমর্থন রয়েছে। আপনি যখন CUDA- র জন্য স্থির হয়েছিলেন কেবলমাত্র তখনই যখন আপনি CUDA রানটাইম লাইব্রেরি যেমন FFT এর CUFFT বা BLAS (ম্যাট্রিক্স / ভেক্টর ক্রিয়াকলাপ) এর জন্য CUBLAS ব্যবহার করতে চান। যদিও ওপেনসিএল-তে অনুরূপ লাইব্রেরি সরবরাহের জন্য পন্থা রয়েছে তবে এগুলি সরাসরি জাভা দিক থেকে ব্যবহার করা যাবে না, যদি না আপনি এই লাইব্রেরির জন্য নিজের জেএনআই বাইন্ডিং তৈরি করেন।
: আপনি এটা শুনতে যে অক্টোবর 2012 সালে, OpenJDK হটস্পট গ্রুপ প্রকল্প "সুমাত্রা" শুরু আকর্ষণীয় হতে পারে http://openjdk.java.net/projects/sumatra/ । এই প্রকল্পের লক্ষ্য হ'ল JVM- তে সরাসরি জিপিইউ সহায়তা জেআইটি-র সহায়তায় সরবরাহ করা। বর্তমান অবস্থা এবং প্রথম ফলাফল তাদের মেইলিং লিস্টে http://mail.openjdk.java.net/mailman/listinfo/sumatra-dev এ দেখা যাবে
তবে কিছুক্ষণ আগে আমি সাধারণভাবে "জিপিইউতে জাভা" সম্পর্কিত কিছু সংস্থান সংগ্রহ করেছি। আমি এগুলি আবার এখানে সংক্ষেপে জানাব, কোনও নির্দিষ্ট ক্রমে in
( অস্বীকৃতি : আমি http://jcuda.org/ এবং http://jocl.org/ এর লেখক )
(বাইট) কোড অনুবাদ এবং ওপেনসিএল কোড জেনারেশন:
https://github.com/aparapi/aparapi : একটি ওপেন-সোর্স লাইব্রেরি যা এএমডি দ্বারা সক্রিয় ও রক্ষণাবেক্ষণ করা হয়। একটি বিশেষ "কার্নেল" শ্রেণিতে, কেউ একটি নির্দিষ্ট পদ্ধতিকে ওভাররাইড করতে পারে যা সমান্তরালে কার্যকর করা উচিত। এই পদ্ধতির বাইট কোডটি একটি নিজস্ব বাইকোড রিডার ব্যবহার করে রানটাইমে লোড হয়। কোডটি ওপেনসিএল কোডে অনুবাদ করা হয়, যা পরে ওপেনসিএল সংকলক ব্যবহার করে সংকলিত হয়। ফলাফলটি তখন ওপিসিএল ডিভাইসে কার্যকর করা যেতে পারে যা জিপিইউ বা সিপিইউ হতে পারে। যদি ওপেনসিএল-তে সংকলন সম্ভব না হয় (বা কোনও ওপেনসিএল উপলব্ধ নেই), কোডটি থ্রেড পুল ব্যবহার করে এখনও সমান্তরালে কার্যকর করা হবে।
https://github.com/pcpratts/rootbeer1 : জাভার অংশগুলি CUDA প্রোগ্রামগুলিতে রূপান্তর করার জন্য একটি ওপেন সোর্স লাইব্রেরি। এটি ডেডিকেটেড ইন্টারফেসগুলি সরবরাহ করে যা GPU- তে একটি নির্দিষ্ট শ্রেণি নির্বাহ করা উচিত তা বোঝাতে প্রয়োগ করা যেতে পারে। অপরাপীর বিপরীতে, এটি স্বয়ংক্রিয়ভাবে "প্রাসঙ্গিক" ডেটা (যা অবজেক্ট গ্রাফের সম্পূর্ণ প্রাসঙ্গিক অংশটি) জিপিইউ-এর জন্য উপযোগী এমন উপস্থাপনায় সিরিয়ালাইজ করার চেষ্টা করে।
https://code.google.com/archive/p/java-gpu/ : বর্ণিত জাভা কোডটি (কিছু সীমাবদ্ধতা সহ) সিউডিএ কোডে অনুবাদ করার জন্য একটি লাইব্রেরি, পরে এটি একটি লাইব্রেরিতে সংকলিত হয় যা জিপিইউতে কোডটি কার্যকর করে। গ্রন্থাগারটি পিএইচডি থিসিসের প্রসঙ্গে তৈরি করা হয়েছিল, এতে অনুবাদ প্রক্রিয়া সম্পর্কে গভীর পটভূমি তথ্য রয়েছে।
https://github.com/ochafik/ScalaCL : ওপেনসিএল-এর জন্য স্কালা বাইন্ডিংস। ওপেনসিএল এর সমান্তরালে বিশেষ স্কাল সংগ্রহগুলি প্রক্রিয়া করার অনুমতি দেয়। সংগ্রহের উপাদানগুলিতে ডাকা ফাংশনগুলি সাধারণ স্কেলা ফাংশন (কিছু সীমাবদ্ধতা সহ) হতে পারে যা ওপেনসিএল কার্নেলগুলিতে অনুবাদ করা হয়।
ভাষার বর্ধন
http://www.ateji.com/px/index.html : জাভা জন্য একটি ভাষা বর্ধন যা সমান্তরাল নির্মাণ (যেমন লুপগুলির জন্য সমান্তরাল, ওপেনএমপি শৈলী) যা ওপেনসিএল সহ জিপিইউতে কার্যকর করা হয় allows দুর্ভাগ্যক্রমে, এই খুব প্রতিশ্রুতিবদ্ধ প্রকল্প আর রক্ষণাবেক্ষণ করা হয় না।
http://www.habanero.rice.edu/Publications.html (জেসিইউডিএ): একটি লাইব্রেরি যা বিশেষ জাভা কোডকে (জেসিইউডিএ কোড বলা হয়) জাভা- এবং সিইউডিএ-সি কোডে অনুবাদ করতে পারে, যা পরে সংকলন এবং সম্পাদন করা যেতে পারে জিপিইউ। তবে গ্রন্থাগারটি সর্বজনীনভাবে উপলব্ধ বলে মনে হয় না।
https://www2.informatik.uni-erlangen.de/EN/research/JavaOpenMP/index.html : CUDA ব্যাকএন্ড সহ ওপেনএমপি নির্মাণের জন্য জাভা ভাষার সম্প্রসারণ
জাভা ওপেনসিএল / সিইউডিএ বাইন্ডিং লাইব্রেরি
https://github.com/ochafik/JavaCL : ওপেনসিএল-এর জন্য জাভা বাইন্ডিংস: স্ব-উত্পন্ন নিম্ন-স্তরের বাইন্ডিংয়ের উপর ভিত্তি করে একটি অবজেক্ট-ওরিয়েন্টেড ওপেনসিএল লাইব্রেরি
http://jogamp.org/jocl/www/ : ওপেনসিএল-এর জন্য জাভা বাইন্ডিংস: স্বতঃ-উত্পাদিত নিম্ন-স্তরের বাইন্ডিংয়ের উপর ভিত্তি করে একটি অবজেক্ট-ওরিয়েন্টেড ওপেনসিএল লাইব্রেরি
http://www.lwjgl.org/ : ওপেনসিএল-এর জন্য জাভা বাঁধাই: স্বতঃ-উত্পাদিত নিম্ন-স্তরের বাইন্ডিংগুলি এবং অবজেক্ট-ভিত্তিক সুবিধার্থে ক্লাসগুলি
http://jocl.org/ : ওপেনসিএল-এর জন্য জাভা বাঁধাই: নিম্ন-স্তরের বাইন্ডিংগুলি যে মূল ওপেনসিএল এপিআইয়ের 1: 1 ম্যাপিং
http://jcuda.org/ : CUDA- র জন্য জাভা বাইন্ডিংগুলি: নিম্ন-স্তরের বাইন্ডিংগুলি যা মূল CUDA এপিআইয়ের 1: 1 ম্যাপিং হয়
বিবিধ
http://sourceforge.net/projects/jopencl/ : ওপেনসিএল-এর জন্য জাভা বাইন্ডিংস। ২০১০ সালের পরে আর রক্ষণাবেক্ষণ করা হবে না বলে মনে হচ্ছে
http://www.hoopoe-cloud.com/ : CUDA এর জন্য জাভা বাইন্ডিং। আর রক্ষণাবেক্ষণ করা হবে না বলে মনে হচ্ছে