NVIDIA cuDSS, mühendislik ve bilimsel hesaplamaları hızlandırmak için tasarlanmış birinci nesil sparse direct solver kütüphanesidir. cuDSS, veri merkezlerinde ve farklı ortamlarda giderek daha fazla benimsenmektedir ve tek GPU, çoklu GPU ve çoklu düğüm (MGMN) yapılandırmalarını desteklemektedir.
cuDSS, yapısal mühendislik, akış dinamiği, elektromanyetikler, devre simülasyonu, optimizasyon ve AI destekli mühendislik problemleri gibi birçok alanda, bilgisayarlı mühendislik (CAE) iş akışlarını ve bilimsel hesaplamaları hızlandırmak için kritik bir araç haline gelmiştir.
Bu yazı, cuDSS v0.4.0 ve cuDSS v0.5.0 sürümlerinde sunulan bazı ana performans ve kullanım özelliklerini vurgulamaktadır. cuDSS v0.4.0, faktörizasyon ve çözüm adımlarında önemli performans iyileştirmeleri sağlamanın yanı sıra, bellek tahmin API’si, otomatik hibrit bellek seçimi ve değişken grup desteği gibi birkaç yeni özellik de eklemiştir. cuDSS v0.5.0, özellikle daha küçük matrisler için yararlı olan host yürütme modu‘nu eklemiş ve hibrit bellek modu ve analiz aşamasında ev sahibi çoklu iş parçacığı desteği kullanarak önemli performans iyileştirmeleri göstermiştir; bu alan genellikle etkili bir şekilde paralelleşmesi zor bir alandır.
cuDSS v0.4.0 sürümü | cuDSS v0.5.0 sürümü |
PIP tekerleği ve Conda desteği Tek ve çoklu GPU için faktörizasyon ve çözüm performansında iyileştirme (10 kat kadar) Bellek tahmin API’si Otomatik normal/hibrit bellek modu seçimi Değişken (homojen olmayan) grup desteği (değişken N, NNZ, NRHS, LD) |
Özellikle daha küçük matrisler için ev sahibi yürütme modu Kullanıcı tanımlı iş parçacığı arka uç ile (şu anda yalnızca yeniden düzenleme için) ev sahibi çoklu iş parçacığı desteği Yeni pivotlama yöntemi (ölçekleme ile statik pivotlama) Hibrit bellek modu için iyileştirilmiş performans ve bellek gereksinimleri |
Öne Çıkan Özellikler
Bu bölüm, dikkat çekici kullanım iyileştirmeleri ve performans artırımları üzerinde durmaktadır.
Bellek Tahmin API’si
Bellek tahmin API’si, cuDSS kullanıcılarının, en bellek yoğun aşamaya (sayısal faktörizasyon) ulaşmadan önce ihtiyaç duyulan cihaz ve ana bellek miktarını doğru bir şekilde bilmelerini sağlayan önemli bir özelliktir.
Ayrıca, büyük doğrusal sistemler çözüldüğünde veya cuDSS için sınırlı bir bellek bütçesi olduğunda, cihaz belleğinin yetersiz olabileceği senaryolar için özellikle yararlıdır. Her iki durumda da, analiz aşamasından önce hibrit bellek modunu etkinleştirmeniz önerilir.
Eğer hibrit bellek modu etkinleşirse ancak her şey mevcut cihaz belleğine sığarsa (ister kullanıcı tanımlı sınırlamalar ister GPU kapasitesi bazında), cuDSS bunu otomatik olarak algılar ve daha hızlı varsayılan bellek moduna geçer.
Bir doğrusal sistemi cuDSS ile çözmenin tipik çağrı sırası aşağıdaki gibidir:
- Analiz (yeniden düzenleme ve sembolik faktörizasyon)
- Sayısal faktörizasyon (faktörlerin değerlerinin tahsis edildiği ve hesaplandığı aşama)
- Çözüm
Bellek tahmininin tanıtılmasıyla, kullanıcılar artık analiz aşamasından sonra seçilen mod (ister varsayılan ister hibrit bellek) için gereken cihaz ve ana bellek miktarını sorgulayabilirler. Aşağıda gösterildiği gibi, sorgulama, küçük bir sabit boyutlu diziye yazan cudssDataGet
çağrısının tek bir çağrısıyla gerçekleştirilir.
/*
* cudssExecute(..., CUDSS_PHASE_ANALYSIS, ,,,) sonrasında
*/
int64_t memory_estimates[16] = {0};
cudssDataGet(cudssHandle, solverData, CUDSS_DATA_MEMORY_ESTIMATES,
&memory_estimates, sizeof(memory_estimates);
/* memory_estimates[0] - kalıcı cihaz belleği
* memory_estimates[1] - maksimum cihaz belleği
* memory_estimates[2] - kalıcı ana bellek
* memory_estimates[3] - maksimum ana bellek
* memory_estimates[4] - hibrit bellek modu için minimum cihaz belleği
* memory_estimates[5] - hibrit bellek modu için maksimum ana belleği
* memory_estimates[6,...,15] - gelecekteki kullanım için ayrılmış
*/
Bu özelliği kullanan tam örnek kodu görmek için NVIDIA/CUDALibrarySamples GitHub deposunu ziyaret edin.
Homojen Olmayan Grup API’si
Uygulamanız, her bir sistemin bireysel olarak yeterince büyük olmadığı durumlarda, birden fazla doğrusal sistem çözümlemeyi gerektiriyorsa, performansı artırmak için gruplama yapılabilir. İki tür grup bulunmaktadır: homojen ve homojen olmayan. Homojen olmayan gruplar, matrislerin boyutları veya seyrek desenleri üzerinde kısıtlamalar getirmediği için avantaj sağlar.
cuDSS v0.4.0, homojen olmayan gruplar için destek sunmaktadır. Opak cudssMatrix_t
nesneleri, tek bir matrisi veya bir grup matrisi temsil edebilir ve böylece yalnızca matriks nesnelerinin nasıl oluşturulduğu ve değiştirildiği kısmı değiştirilmesi yeterlidir.
Yoğun veya seyrek matris grupları yaratmak için, v0.4.0 yeni API’ler sunmuştur: cudssMatrixCreateBatchDn
veya cudssMatrixCreateBatchCsr
. Matris verilerini değiştirmek için benzer şekilde eklenen API’ler: cudssMatrixSetBatchValues
, cudssMatrixSetBatchCsrPointers
, cudssMatrixGetBatchDn
, ve cudssMatrixGetBatchCsr
gibi işlevlerdir. cuDSS v0.5.0 ise cudssMatrixFormat_t
yapısını değiştirir ve artık cudssMatrixGetFormat
ile cudssMatrix_t
nesnesinin tek bir matris mi yoksa grup mu olduğunu belirleme olanağı sunar.
Matris gruplarınız oluşturulduğunda, bunlar cudssExecute
ana çağrılarına tam olarak tek matrisler gibi aynı şekilde geçilebilir. Aşağıdaki örnek, çözüm ve sağ taraflar için yoğun matris gruplarını ve matrisler için seyrek matris grubunu yaratmanın nasıl yapıldığını göstermektedir.
/*
* Grup API'si için, ölçekli argümanlar nrows, ncols, vb.
* belirtilen tamsayı türündeki batchCount boyutunda diziler olmalıdır
*/
cudssMatrix_t b, x;
cudssMatrixCreateBatchDn(&b, batchCount, ncols, nrhs, ldb, batch_b_values, CUDA_R_32I, CUDA_R_64F, CUDSS_LAYOUT_COL_MAJOR);
cudssMatrixCreateBatchDn(&x, batchCount, nrows, nrhs, ldx, batch_x_values, CUDA_R_32I, CUDA_R_64F, CUDSS_LAYOUT_COL_MAJOR);
cudssMatrix_t A;
cudssMatrixCreateBatchDn(&A, batchCount, nrows, ncols, nnz, batch_csr_offsets, NULL, batch_csr_columns, batch_csr_values, CUDA_R_32I, CUDA_R_64F, mtype, mview, base);
/*
* Geri kalanı aynı kalır, A, b ve x grup matrisleri için cudssExecute() çağrıları dahil
*/
Bu özelliği kullanan tam örnek kodu görmek için NVIDIA/CUDALibrarySamples GitHub deposunu ziyaret edin.
Ev Sahibi Çoklu İş Parçacığı API’si
Çoğu hesaplama ve bellek yoğun olan kuDSS görevleri GPU’da yürütülse de, bazı önemli görevler hala ana bilgisayarda çalıştırılmaktadır. v0.5.0 sürümünden önce, cuDSS ana bilgisayarda çoklu iş parçacığı (MT) desteklemiyordu ve ana yürütme her zaman tek iş parçacıklıydı. Yeni sürüm, pthreads, OpenMP ve iş parçacığı havuzları gibi kullanıcı tanımlı iş parçacığı çalışma zamanları için destek sunarak, cuDSS‘ye esneklik kazandırmıştır.
Ana bilgisayarda yürütülen görevler arasında, yeniden düzenleme (analiz aşamasının kritik bir parçası) genellikle dikkat çekmektedir, çünkü toplam yürütme süresinin (analiz artı faktörizasyon artı çözüm) önemli bir bölümünü alabilmektedir. Bu yaygın darboğazı gidermek için cuDSS v0.5.0, ana bilgisayarda genel MT desteği ve yeniden düzenlemenin çoklu iş parçacıklı bir versiyonunu tanıtmaktadır. Ancak bu özellik yalnızca CUDSS_ALG_DEFAULT
yeniden düzenleme algoritması için mevcuttur.
Yeni MT modunun etkinleştirilmesi uygulamanız için basittir; yalnızca iş parçacığı katman kütüphanesinin adını kullanarak cudssSetThreadingLayer
fonksiyonunu çağırmanız ve (isteğe bağlı olarak) cuDSS‘nin kullanmasına izin verdiğiniz maksimum iş parçacığı sayısını belirtmeniz yeterlidir. Aşağıda bunu gösteren bir örnek bulunmaktadır.
/*
* cudssExecute(CUDSS_PHASE_ANALYSIS) çağrısından önce
* thrLibFileName - cuDSS iş parçacığı katmanı kütüphanesinin dosya adı
* Eğer NULL ise, CUDSS_THREADING_LIB = ‘dosya adı’ aktarılacaktır
*/
cudssSetThreadingLayer(cudssHandle, thrLibFileName);
/*
* (isteğe bağlı) cuDSS'nin kullanacağı iş parçacığı sayısını ayarlayın
*/
int32_t nthr = ...;
cudssConfigSet(cudssHandle, solverConfig, CUDSS_CONFIG_HOST_NTHREADS,
&nthr, sizeof(nthr);
Bu özelliği kullanan tam örnek kodu görmek için NVIDIA/CUDALibrarySamples GitHub deposunu ziyaret edin.
Ev Sahibi Yürütme
cuDSS‘nin ana hedefi, seyrek direkt çözücü işlevselliği için GPU hızlandırması sağlamaktır. Ancak, gerçekten küçük ve küçük matrislerde (genellikle GPU’yu doygun hale getirecek kadar paralelleşme olmadığında) GPU kullanımının yoğunlaşması önemli bir maliyet getirebilir. Bu, toplam çalışma süresini geçebilir.
cuDSS v0.5.0, faktörizasyon ve çözüm aşamalarını ev sahibi üzerinde uygulamak için ev sahibi yürütme modunu tanıtmaktadır. Bu mod etkinleştirildiğinde, cuDSS, faktörizasyon ve çözüm aşamalarında hesaplanacak kısımları GPU’da mı yoksa ana bilgisayarda mı gerçekleştireceğini belirlemek için boyuta dayalı bir dağıtım kullanacaktır.
Ayrıca, hibrit yürütme modu etkinleştirildiğinde, kullanıcılar, matris verileri için ana belleği geçebilir; bu, ana bilgisayara gereksiz bellek geçişlerini ortadan kaldırır ve küçük matrisler için performansı artırabilir.
Aşağıdaki örnek, hibrit yürütme modunun nasıl etkinleştirileceğini göstermektedir.
/*
* cudssExecute(CUDSS_PHASE_ANALYSIS) çağrısından önce
*/
int hybrid_execute_mode = 1;
cudssConfigSet(solverConfig, CUDSS_CONFIG_HYBRID_EXECUTE_MODE,
&hybrid_execute_mode, sizeof(hybrid_execute_mode);
Bu özelliği kullanan tam örnek kodu görmek için NVIDIA/CUDALibrarySamples GitHub deposunu ziyaret edin.
Performance improvements of cuDSS v0.4.0 and v0.5.0
cuDSS v0.4.0 ve v0.5.0, çeşitli iş yükleri arasında önemli performans iyileştirmeleri sağladı.
v0.4.0‘da, faktörizasyon ve çözüm adımları, üçgen faktörlerinin bazı kısımlarının yoğun olduğu durumlar tespit edilerek ve daha verimli yoğun BLAS çekirdekleri kullanılarak hızlandırılmıştır. Bu optimizasyon sayesinde elde edilen hızlanma, büyük ölçüde faktörlerin sembolik yapısına bağlıdır; bu da orijinal matris ve yeniden düzenleme permütasyonuyla etkilenir.
Şekil 1, v0.4.0’ın v0.3.0’a kıyasla performans iyileştirmelerini göstermektedir; bu, SuiteSparse Matris Koleksiyonu‘ndan elde edilen büyük bir matris kümesi üzerinde NVIDIA H100 GPU’da analiz edilmiştir.

Grafikte görüldüğü gibi, hem faktörizasyon hem de çözüm aşamaları önemli iyileştirmeler yaşadı; geometrik ortalama sırasıyla 1.74 ve 2.0 olarak hesaplandı. Bazı matrislerin nispeten seyrek üçgen faktörleri belirgin hızlanma göstermedi. Ancak, Serena
, conf5_4_8x8_20
, ve atmosmodd
gibi matris türleri (çeşitli HPC uygulamalarından gelen matrisler) faktörizasyon aşamasında 8 katı, çözüm aşamasında ise 6 katı aşan hızlanmalar yaşadı.
Analiz aşaması, cuDSS v0.5.0‘da tanıtılan çoklu iş parçacıklı yeniden düzenlemeden dolayı önemli ölçüde hız kazandı. Şekil 2, analiz aşaması performansını v0.5.0 ve v0.4.0 arasında karşılaştırmaktadır; yine SuiteSparse Matris Koleksiyonu’ndan alınan aynı matris seti kullanılmıştır.
Performans iyileştirmesinin sebebi, v0.4.0‘ın tek iş parçacıklı yeniden düzenleme uygulaması kullanırken, v0.5.0‘ın ana bilgisayardaki birden fazla CPU iş parçacığı (çekirdek) üzerinden faydalanmasıdır. Durum böyle olunca, karmaşık yeniden düzenleme algoritmalarının etkin bir şekilde paralelleşmesinin zor olduğu iyi bilinse de, cuDSS v0.5.0, birden fazla CPU çekirdeğinden iyi bir şekilde yararlanmaktadır ve böylece 1.98’lik bir geometrik ortalama hız kazanımı ile maksimum iyileşmeyi 4.82’ye kadar çıkarmaktadır.
Not olarak, analiz aşaması hem (isteğe bağlı olarak çok iş parçacıklı) yeniden düzenlemeyi hem de GPU’da gerçekleştirilen sembolik faktörizasyonu içermektedir. Bu nedenle, yeniden düzenleme kısmındaki gerçek hız kazanımının grafiklerde belirtilen değerlerden daha yüksek olduğu düşünülmektedir.

cuDSS v0.5.0, hibrit bellek modunun performansını optimize etmeye de devam etmektedir; bu özellik, v0.3.0‘da tanıtıldı ve cuDSS içerisinde kullanılan bazı iç dizilerin ana bellekte yer almasına olanak tanıyarak, tek bir GPU’nun belleğine sığmayan sistemlerin çözülmesini sağladı. Özellikle NVIDIA Grace temelli sistemlerde, CPU ile GPU arasındaki bellek band genişliğinin oldukça yüksek olması nedeniyle bu özellik oldukça iyi çalışmaktadır.
Şekil 3, cuDSS 0.5.0 performans iyileştirmelerini, hibrit bellek modunda bir NVIDIA Grace Hopper sistemi (Grace CPU ve NVIDIA H100 GPU) ile x86 sistemi (Intel Xeon Platinum 8480CL, 2S) ve NVIDIA H100 GPU arasında karşılaştırmaktadır; büyük matrisleri kullanarak.

Daha önce bahsedildiği gibi, cuDSS v0.5.0, hibrit yürütme modu tanıtılarak küçük matrisler için cuDSS’nin performansını artırmaktadır. Şekil 4, hibrit yürütme modunun (ana bilgisayar yürütmesi etkinleştirildiğinde) faktörizasyon ve çözüm aşamaları için CPU çözücüsü (Intel MKL PARDISO) karşısında sağlayacağı hız kazançlarını göstermektedir.

Son olarak, Şekil 5 küçük matrisler üzerinde cuDSS v0.5.0’in hibrit yürütme modunun (varsayılan mod olan cuDSS v0.4.0) performans iyileştirmesini göstermektedir. Faktörizasyon aşamasındaki hız kazanımı sadece gerçekten küçük matrisler için belirgin olurken, çözüm aşamasında 30K denkleme kadar olan sistemler için hız kazanımları gözlemlenmektedir. Bunun sebebi, çözüm aşamasının faktörizasyon aşamasına göre daha az iş yükü taşıması ve test edilen matrisler için bir GPU’dan etkili bir şekilde yararlanamamasıdır.

Özet
NVIDIA cuDSS v0.4.0 ve v0.5.0 sürümleri, performansı önemli ölçüde arttıran birçok yeni iyileştirme sunmaktadır. Ana hatlar arasında faktörizasyon ve çözüm süreçlerinde genel hızlandırmalar, hibrit bellek ve yürütme modları, ev sahibi çoklu iş parçacığı desteği ve değişken grup boyutları için destek yer almaktadır. Performansa devam eden yatırımımızın yanı sıra, API’lerimizi geliştirmeye devam edecek, kullanıcılarımıza daha fazla esneklik ve ayrıntılı kontrol sağlayacak şekilde işlevselliği genişleteceğiz.
Başlamak için hazır mısınız? NVIDIA cuDSS v0.5.0‘ı indirin.
Daha fazla bilgi edinmek için cuDSS v0.5.0 sürüm notlarına ve aşağıdaki önceki yazılara göz atın:
- NVIDIA cuDSS Kütüphanesi, ABD Elektrik Şebekesini Optimize Etme Engellerini Kaldırıyor
- Öne Çıkan: Honeywell, NVIDIA cuDSS ile Endüstriyel Süreç Simülasyonunu Hızlandırıyor
Yorum kısmında sohbet etmeye katılın ve geri bildirimde bulunun: NVIDIA Geliştirici Forumu.