SORU
26 Aralık 2012, ÇARŞAMBA


Hataları CUDA çalışma zamanı API kullanarak kontrol etmek için kurallı yolu nedir?

CUDA sorular cevaplar ve yorumlara bakarak, ve CUDA tag wiki genellikle her API çağrısı iade durumunu hatalar için kontrol önerilir görüyorum. API belgeleri içeren fonksiyonları gibi cudaGetLastError, cudaPeekAtLastError cudaGetErrorString, ama ne olduğunu en iyi şekilde koy bu arada güvenilir bir şekilde yakalamak ve rapor hatasız gerektiren bir sürü ekstra kod?

CEVAP
26 Aralık 2012, ÇARŞAMBA


Muhtemelen en iyi yolu çalışma zamanı hataları kontrol etmek için API kodu bu gibi stili iddia işleyicisi işlevi ve kapsayıcı bir makro tanımlamak için:

#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);
   }
}

Sonra sarar API çağrısı iade durumunu işleyecek olan örneğin gpuErrchk makro ile her API çağrısı sarın:

gpuErrchk( cudaMalloc(&a_d, size*sizeof(int)) );

Eğer bir çağrı bir hata varsa, bir metin mesajı hata ve hatanın oluştuğu kod dosyası ve satır tarif stderr patlar ve uygulamadan çıkın. Makul eğer gerekli olsaydı gpuAssert bir istisna yükseltmek için değiştirmek yerine daha sofistike bir uygulama exit() diyebilirsin.

İkinci ilgili bir soru doğrudan standart çalışma zamanı API çağrıları gibi makro bir ara sarılmış olamaz çekirdek başlattı hataları kontrol etmek için nasıl. Çekirdekleri için, şöyle bir şey:

kernel<<<1,1>>>(a);
gpuErrchk( cudaPeekAtLastError() );
gpuErrchk( cudaDeviceSynchronize() );

olacak birincisi geçersiz argüman başlatmak için kontrol, ana çekirdeğe kadar bekleyin zorlamak yürütme bir hata vermiyor ve denetler. Senkronizasyon eğer böyle sonraki engelleme API çağrısı varsa ortadan kaldırılabilir:

kernel<<<1,1>>>(a_d);
gpuErrchk( cudaPeekAtLastError() );
gpuErrchk( cudaMemcpy(a_h, a_d, size * sizeof(int), cudaMemcpyDeviceToHost) );

cudaMemcpy çağrı hatalar çekirdek infazı sırasında meydana gelen ya da hafızasından o dönebilirsiniz kendini kopyalayın. Bu yeni başlayanlar için kafa karıştırıcı olabilir, ve bir çekirdek başlatmak sonra açık senkronizasyon kullanarak daha kolay kaynaklanan sorunlar olabilir nerede anlamak için hata ayıklama sırasında öneriyoruz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BioHunta

    BioHunta

    28 Mayıs 2006
  • merumputdotcom

    merumputdotc

    24 ŞUBAT 2012
  • Sean Murphy

    Sean Murphy

    4 ŞUBAT 2009