রানটাইম এপিআই কোডটিতে ত্রুটিগুলি পরীক্ষা করার সম্ভবত সেরা উপায়টি হ'ল স্ট্যান্ডার হ্যান্ডলারের ফাংশন এবং মোড়ক ম্যাক্রোর মতো এটি সংজ্ঞায়িত করা:
#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
inline void gpuAssert(cudaError_t code, const char *file, int line, bool abort=true)
{
if (code != cudaSuccess)
{
fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
if (abort) exit(code);
}
}
তারপরে আপনি gpuErrchk
ম্যাক্রো দিয়ে প্রতিটি এপিআই কলকে মোড়াতে পারবেন , যা এপিআই কলটিকে মোড়কের মোড়ের অবস্থা থেকে প্রক্রিয়া করবে, উদাহরণস্বরূপ:
gpuErrchk( cudaMalloc(&a_d, size*sizeof(int)) );
যদি কোনও কলটিতে ত্রুটি ঘটে থাকে তবে ত্রুটি বর্ণনা করে এমন একটি পাঠ্য বার্তা এবং আপনার কোডটিতে ফাইল এবং লাইন যেখানে ত্রুটি ঘটেছে তাতে প্রেরণ হবে stderr
এবং অ্যাপ্লিকেশনটি প্রস্থান করবে। আপনি প্রয়োজনে আরও পরিশীলিত অ্যাপ্লিকেশন gpuAssert
কল করার চেয়ে একটি ব্যতিক্রম বাড়াতে কল্পিত পরিবর্তন করতে exit()
পারেন।
একটি দ্বিতীয় সম্পর্কিত প্রশ্ন হ'ল কার্নেল লঞ্চগুলিতে ত্রুটিগুলি কীভাবে পরীক্ষা করা যায়, যা স্ট্যান্ডার্ড রানটাইম এপিআই কলগুলির মতো ম্যাক্রো কলটিতে সরাসরি আবৃত করা যায় না। কার্নেলের জন্য, এরকম কিছু:
kernel<<<1,1>>>(a);
gpuErrchk( cudaPeekAtLastError() );
gpuErrchk( cudaDeviceSynchronize() );
প্রথমে অবৈধ প্রবর্তন যুক্তিটি পরীক্ষা করবে, তারপরে হোস্টকে কর্নেল থামানো এবং একটি সম্পাদন ত্রুটির জন্য পরীক্ষা না করা পর্যন্ত অপেক্ষা করতে বাধ্য করবে। আপনার যদি পরে এর মতো ব্লক করা এপিআই কল থাকে তবে সিঙ্ক্রোনাইজেশনটি নির্মূল করা যাবে:
kernel<<<1,1>>>(a_d);
gpuErrchk( cudaPeekAtLastError() );
gpuErrchk( cudaMemcpy(a_h, a_d, size * sizeof(int), cudaMemcpyDeviceToHost) );
এই ক্ষেত্রে cudaMemcpy
কলটি কার্নেল প্রয়োগের সময় ঘটে যাওয়া ত্রুটিগুলি বা মেমরির অনুলিপি থেকে নিজেই ফিরে আসতে পারে। এটি শিক্ষানবিসের জন্য বিভ্রান্তিকর হতে পারে এবং আমি সমস্যা তৈরি হতে পারে তা বুঝতে সহজ করার জন্য ডিবাগিংয়ের সময় কার্নেল লঞ্চের পরে সুস্পষ্ট সিঙ্ক্রোনাইজেশন ব্যবহার করার পরামর্শ দেব।
নোট করুন যে CUDA ডায়নামিক প্যারালালিজম ব্যবহার করার সময় , খুব অনুরূপ পদ্ধতিটি ডিভাইস কার্নেলগুলিতে CUDA রানটাইম এপিআই এর যে কোনও ব্যবহারে প্রয়োগ করা উচিত এবং সেই সাথে কোনও ডিভাইস কার্নেল প্রবর্তন করার পরে:
#include <assert.h>
#define cdpErrchk(ans) { cdpAssert((ans), __FILE__, __LINE__); }
__device__ void cdpAssert(cudaError_t code, const char *file, int line, bool abort=true)
{
if (code != cudaSuccess)
{
printf("GPU kernel assert: %s %s %d\n", cudaGetErrorString(code), file, line);
if (abort) assert(0);
}
}
getLastCudaError
এবংcheckCudaErrors
যা প্রায় কাছাকাছি কি বর্ণনা করা হয় না গৃহীত উত্তর । বিক্ষোভের জন্য নমুনাগুলি দেখুন। কেবলমাত্র সরঞ্জামকিট সহ নমুনাগুলি ইনস্টল করতে চয়ন করুন এবং আপনার এটি থাকবে।