Linux Ubuntu 10.04'ün altında cuda SDK'yı yüklemeyi başardım. Grafik kartım bir NVIDIA geForce GT 425M'dir ve bazı ağır hesaplama problemleri için kullanmak istiyorum. Şaşırtıcı olan: bazı imzasız 128 bit int var kullanmak için herhangi bir yolu var mı? Programımı CPU üzerinde çalıştırmak için gcc kullanırken, __uint128_t türünü kullanıyordum, ancak cuda ile çalışmak işe yaramıyor. Cuda'da 128 bit tam sayıya sahip olmak için yapabileceğim bir şey var mı? Cuda'da 128 bit tam sayı?
size doğal 128 bitlik tamsayılar desteklemezcevap
, böyle bir uint4 gibi uygun CUDA vektör tipi, üst üste 128-bit türü harita, ve PTX satır içi derleme kullanarak işlevselliğini uygulamak isteyeyim . ek şöyle olacaktır:
typedef uint4 my_uint128_t;
__device__ my_uint128_t add_uint128 (my_uint128_t addend, my_uint128_t augend)
{
my_uint128_t res;
asm ("add.cc.u32 %0, %4, %8;\n\t"
"addc.cc.u32 %1, %5, %9;\n\t"
"addc.cc.u32 %2, %6, %10;\n\t"
"addc.u32 %3, %7, %11;\n\t"
: "=r"(res.x), "=r"(res.y), "=r"(res.z), "=r"(res.w)
: "r"(addend.x), "r"(addend.y), "r"(addend.z), "r"(addend.w),
"r"(augend.x), "r"(augend.y), "r"(augend.z), "r"(augend.w));
return res;
}
benzer şekilde 32 bit parçalar halinde 128 bit numaraları kırma 64 bit kısmi ürünlerin işlem ve uygun ekleyerek PTX içi düzeneği kullanılarak inşa edilebilir çarpma. Açıkçası bu biraz iş gerektiriyor. C seviyesinde 64 bitlik parçalara bölünerek ve normal 64-bit çarpma ve bazı eklemelerle uyumlu olarak __umul64hi() kullanılarak C seviyesinde makul bir performans elde edilebilir. Bu aşağıda neden olacaktır:
Aşağıda__device__ my_uint128_t mul_uint128 (my_uint128_t multiplicand,
my_uint128_t multiplier)
{
my_uint128_t res;
unsigned long long ahi, alo, bhi, blo, phi, plo;
alo = ((unsigned long long)multiplicand.y << 32) | multiplicand.x;
ahi = ((unsigned long long)multiplicand.w << 32) | multiplicand.z;
blo = ((unsigned long long)multiplier.y << 32) | multiplier.x;
bhi = ((unsigned long long)multiplier.w << 32) | multiplier.z;
plo = alo * blo;
phi = __umul64hi (alo, blo) + alo * bhi + ahi * blo;
res.x = (unsigned int)(plo & 0xffffffff);
res.y = (unsigned int)(plo >> 32);
res.z = (unsigned int)(phi & 0xffffffff);
res.w = (unsigned int)(phi >> 32);
return res;
}
PTX satır içi montaj kullanır 128 bit çarpma bir sürümüdür. CUDA 4.2 ile birlikte gönderilen PTX 3.0'ı gerektirir ve bu kod, en azından hesaplama kapasitesi 2.0 olan bir GPU, yani bir Fermi veya Kepler sınıfı cihaz gerektirir. Kod, 128 bitlik bir çoğaltmayı uygulamak için on altı adet 32 bitlik çarpma gerektiğinden, en az sayıda komut kullanır. Karşılaştırma yapmak gerekirse, yukarıda CUDA intrinsics kullanan varyant, sm_20 hedefi için 23 talimatı derler.
__device__ my_uint128_t mul_uint128 (my_uint128_t a, my_uint128_t b)
{
my_uint128_t res;
asm ("{\n\t"
"mul.lo.u32 %0, %4, %8; \n\t"
"mul.hi.u32 %1, %4, %8; \n\t"
"mad.lo.cc.u32 %1, %4, %9, %1;\n\t"
"madc.hi.u32 %2, %4, %9, 0;\n\t"
"mad.lo.cc.u32 %1, %5, %8, %1;\n\t"
"madc.hi.cc.u32 %2, %5, %8, %2;\n\t"
"madc.hi.u32 %3, %4,%10, 0;\n\t"
"mad.lo.cc.u32 %2, %4,%10, %2;\n\t"
"madc.hi.u32 %3, %5, %9, %3;\n\t"
"mad.lo.cc.u32 %2, %5, %9, %2;\n\t"
"madc.hi.u32 %3, %6, %8, %3;\n\t"
"mad.lo.cc.u32 %2, %6, %8, %2;\n\t"
"madc.lo.u32 %3, %4,%11, %3;\n\t"
"mad.lo.u32 %3, %5,%10, %3;\n\t"
"mad.lo.u32 %3, %6, %9, %3;\n\t"
"mad.lo.u32 %3, %7, %8, %3;\n\t"
"}"
: "=r"(res.x), "=r"(res.y), "=r"(res.z), "=r"(res.w)
: "r"(a.x), "r"(a.y), "r"(a.z), "r"(a.w),
"r"(b.x), "r"(b.y), "r"(b.z), "r"(b.w));
return res;
}
CUDA'yı Programlama çok Matteo Monti Msoft ederiz. İki 64 bit tam sayı kullanarak işlemleri kendiniz yapabilirsiniz.
this post deGörünüş:
En iyi performans içintypedef struct {
unsigned long long int lo;
unsigned long long int hi;
} my_uint128;
my_uint128 add_uint128 (my_uint128 a, my_uint128 b)
{
my_uint128 res;
res.lo = a.lo + b.lo;
res.hi = a.hi + b.hi + (res.lo < a.lo);
return res;
}
Çok teşekkür ederim! Sadece bir soru daha var: Verimlilik açısından, bu yeterince hızlı mı olacak? –
Bu kodu CPU'mda test ettim. Aslında çalışır, ancak __uint128_t türünü kullanmaktan 6 kat daha yavaş ... daha hızlı yapmanın bir yolu yok mu? –
CPU'daki bu “my_uint128” ile CPU'da dahili 128 bit tam sayıları test ettiniz mi? Tabii ki yerel destek daha hızlı olacak. Umut, bu 128 bit tipte GPU üzerindeki performansın, dahili 128 bit tam sayılarla CPU'daki performanstan daha hızlı olacağıdır. – tkerwin
- 1. Windows'ta c ile 128 bit tam sayı?
- 2. XOR 128 bit bitsets
- 3. PHP'de 64 bit tam sayı nasıl?
- 4. JavaScript yazılan diziler: 64 bit tam sayı?
- 5. x86 128 bit atomik işlemler
- 6. RC4 128 bit şifreleme C#
- 7. Bluetooth 16 bit hizmet UUID'sini 128 bit UUID'ye nasıl dönüştürebilirim?
- 8. Tcl'de imzasız 32 bit tam sayı temsil edecek şekilde tcl
- 9. C++'da 512 bit bir tam sayı nasıl tanımlarım?
- 10. ARM Neon intrinsics kullanarak 128-bit rotasyon
- 11. ARM NEON: 128 bit değerlerini karşılaştırarak
- 12. EDSAC - 17 bit ve 35 bit tam sayıları
- 13. 32 bit bayt yerine sayı
- 14. time.sleep tam sayı gerektirir?
- 15. Tam Sayı Null Yap
- 16. Tam sayı aralığında tam eşleşme aralığı
- 17. "Genişletilmiş tam sayı türleri" nelerdir? Okuduğum kitaptan aktaran
- 18. Tam sayı taşması nasıl önlenir?
- 19. dize tam sayı olarak dönüştürün
- 20. Tam sayı ve geri kalan
- 21. Tam sayı için Python regex?
- 22. Java'da Tam Sayı dönüştürme tarihi
- 23. Model ciltleme TimeSpan tam sayı
- 24. Yuvarlatılmış en yakın tam sayı
- 25. İki x86 32 bit yazmaçlarını 128 bit x mm kayıt defterine kaydetme
- 26. 128 bit SSE vektöründen 32 bit tamsayı değerlerini yüklemek ve çıkarmak için en etkili yol nedir?
- 27. 128 noktasının hata ayıklaması 128 FFT
- 28. SQL Server'da imzasız 64 bit tam sayıları nasıl depolarsınız?
- 29. Her bitin bir tam sayı aralığında ayarlanma sayısını sayma
- 30. Bit dosya ile tam dosya nasıl okunur
Teşekkürler ÇOK ÇOK! Bu tam olarak ihtiyacım olan şey! –