Bir çok şey yapması gereken bir CUDA çekirdeği olmasını istediğimi söyleyebilirim, ancak tüm çekirdekler için sabit olan kubbe parametreleri var. Bu argümanlar bir giriş olarak ana programa geçirilir, böylece #DEFINE
'da tanımlanamazlar.Sabit argümanları bir CUDA çekirdeğine geçirmenin en hızlı (veya en zarif) yolu
Çekirdek, birden çok kez (yaklaşık 65 K) çalışır ve matematiğini yapmak için bu parametrelere (ve bazı diğer girdilere) gereksinim duyar.
Sorum şu: Bu sabitlerin çekirdeklere aktarılmasının en hızlı (veya en zarif) yolu nedir?
Sabitler 2 veya 3 öğe uzunluğu float*
veya int*
dizileridir. Bunların yaklaşık 5 ~ 10'u olacaklar.
oyuncak Örnek: 2 sabitleri const1
ve const2
__global__ void kernelToyExample(int inputdata, ?????){
value=inputdata*const1[0]+const2[1]/const1[2];
}
daha iyi
__global__ void kernelToyExample(int inputdata, float* const1, float* const2){
value=inputdata*const1[0]+const2[1]/const1[2];
}
veya
__global__ void kernelToyExample(int inputdata, float const1x, float const1y, float const1z, float const2x, float const2y){
value=inputdata*const1x+const2y/const1z;
}
olanya da belki bazı küresel salt okunur bellekte bunları ilan edip çekirdekleri oradan okuyalım mı? Öyleyse, L1, L2, global? Hangisi?
Bilmediğim daha iyi bir yolu var mı?
Bir Tesla K40 üzerinde çalışıyor.
En iyi verim için değerlere göre yerleşik tipler geçirmeniz gereken bir yer okuyorum. –
@StraightLine İlginç. Herhangi bir kaynak? Genelde değişkenler için tahmin ettim, ama bu demet sürekli mi? Hızlı erişim belleğinde bir yere konabilir ve 65K kopyalarını göndermekten daha iyi bir performansa sahip olabilirler mi? –
Bazı optimizasyonlar, cihazınızın hesaplama kapasitesine bağlıdır. 64KB sabit hafızayı kullanabilirsiniz.Ayrıca tüm sabit değerleri bir dizide düzenleyebilir ve derleyiciye bu bellek alanının sabit kalacağını söyleyebilirsiniz. – pQB