2013-08-31 35 views
6

nvcc kullanarak aşağıdaki kodu (CUDA 5.0) derleme, hata "hafıza elemeleri yasadışı kombinasyon", görünür.CUDA: Statik global üye fonksiyonlarını tanımlamak neden mümkün değil? o görünüşte bir sınıfta küresel çekirdekleri olacaktır imkansızdır olarak

class A 
{ 
public: 
    __global__ static void kernel(); 
}; 

__global__ void A::kernel() 
{} 

statik olmayan üyeleri ile uğraşırken ben bu kısıtlamayı anlayabiliyorum, ama çekirdek statik ilan edildiğinde neden hata yine meydana gelir? Bu tür üyelerin çağrılması, bir ad alanında bildirildiğinde (bu durumda A) işlevi çağırmaktan farklı olmayacaktır.

A::kernel <<< 1, 1 >>>(); 

Bunun neden uygulanmadığına dair bir eksiklik var mı (henüz)?

DÜZENLEME: Yanıtlar ve yorumlardaki yanıtlara dayanarak, sorumu yeterince açıklayamadım. Sorum, bir hata neden görünmüyor. Açıkçası, bunun nedeni henüz uygulanmamış olmasıdır. Sorum şu: neden uygulanmadı . Şimdiye kadar, bu özelliğin uygulanmasını engelleyen bir sebep düşünemedim. Meseleleri karmaşıklaştıracak özel bir durumun, yani soruyu unutmuş olabileceğimin farkındayım.

ben bu makul bir özelliği olduğuna inandığımız nedenlerden

şunlardır:

  • Statik fonksiyon çekirdek ana bilgisayarda yaşayan bir nesne üzerinde çağrıldığında Yani bile this işaretçisi yoktur, yoktur Bu verilere ilk etapta erişilemediği için, veriye erişimde herhangi bir çakışma yoktur (hangi nesneden veri?). Sınıfta kendisiyle ilişkilendirilmiş statik bir veri varsa, ana bilgisayarda yaşıyorsa, bu prensipte statik çekirdeğe erişilebilir olması gerektiğini iddia edebilirsiniz. Ancak, statik veriler de desteklenmiyor, bu yüzden tekrar bir çakışma yok. Biz düzenli C++ 'de kullanılan olarak ana bilgisayarda bir nesne üzerinde statik çekirdek çağrılması
  • (A a; a.staticKernel<<<...,...>>>();),) bütün (A::staticKernel<<<...,...>>>(); de nesne olmadan çağırmak tamamen eşdeğer olacaktır.

ben eksik ?

+0

_ _global_ _ fonksiyonu ile bir sınıf olması amacınız nedir? – 4pie0

+0

"Benim sorum bu uygulamaya konmamıştır neden. Şu ana kadar uygulanmakta olan bu özelliğin tutan bir sebep geliyor edemedik olması."- Uygulanabilecek milyonlarca şey var ama böyle bir ihtiyaç yok ve bunlar hiçbir şekilde kabul edilmiyor. – 4pie0

+0

Yani cevabınız:" Sadece değil. "? – JorenHeit

cevap

1

Neyse ki, bu sorudan sonra yaklaşık 4 yıl, istendi clang 4.0 can compile the CUDA language bu örneği düşünün. Ben clang 4.0 ile derlemeye çalıştığınızda

class A 
{ 
public: 
    __global__ static void kernel(); 
}; 

__device__ void A::kernel() 
{} 

int main() 
{ 
    A::kernel <<< 1, 1 >>>(); 
}; 

, Aşağıdaki hatayı alıyorum:

class A 
{ 
public: 
    __global__ static void kernel() 
    { 
     // implementation would go here 
    } 
}; 

Sonra 4,0 başarıyla derler ve o olmadan çalıştırılabilir tınlamak:

test.cu:7:1: error: kernel function 'kernel' must be a free function or static member function 
__global__ void A::kernel() 
^ 
/usr/local/cuda/include/host_defines.h:191:9: note: expanded from macro '__global__' 
     __location__(global) 
     ^
/usr/local/cuda/include/host_defines.h:88:9: note: expanded from macro '__location__' 
     __annotate__(a) 
     ^
/usr/local/cuda/include/host_defines.h:86:9: note: expanded from macro '__annotate__' 
     __attribute__((a)) 
     ^
test.cu:7:20: error: __host__ function 'kernel' cannot overload __global__ function 'kernel' 
__global__ void A::kernel() 
       ^
test.cu:4:28: note: previous declaration is here 
    __global__ static void kernel(); 
         ^
2 errors generated. 

Bu hataları karşılamak için, ben sınıf bildirimi içine çekirdek tanımını inlined ettik herhangi bir hata. Yani bu açıkça CUDA dile bir sınırlama değildir, ama onun fiili standart derleyici. Bu arada, nvcc'in clang'ın sahip olmadığı birçok benzer haksız sınırlama vardır.

+0

http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#function-members – talonmies

+0

@talonmies Bölüm [E. Programlama rehberinin C/C++ Dil Desteği] (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#c-cplusplus-language-support) sadece bir (kısmi) özelliktir. nvcc’in neyi desteklediği veya desteklemediği. Ne yazık ki var olmayan CUDA dil şartnamesi ile ilgisi yok. [B C Dil Uzantıları] (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#c-language-extensions) bölümü yakındır, ancak nvcc' özellikleriyle karıştırılır ve CUDA Çalışma Zamanı API'sı. –