2013-02-14 19 views
5

İplik dizisi büyük olan bir iş parçacığından nasıl çıkarım? Her iki doğru olduğunu,CUDA'daki ayrılma - Çekirdekdeki bir iş parçacığından çıkış

int i = threadIdx.x; 
if(i >= count) 
    return; 
// do logic 

veya

int i = threadIdx.x; 
if(i < count) { 
    // do logic 
} 

Biliyorum, ama hangisi daha performansını etkileyebilir: İki olası görüyor musunuz?

+0

Tavsiye etmem gereken bir şey, her ikisi de size aynı performansı verecektir. – sgarizvi

cevap

3

Her ikisi de performans açısından aynı olsa da, ilkinin tavsiye edilmediğini dikkate almalısınız.

Çekirdeğin içine bir iş parçacığı döndürün, kodunuzun geri kalanında beklenmeyen bir davranışa neden olabilir.

Beklenmeyen davranışlarla Çözgüde gruplandırılmış minimum iş parçacığı birimi ile ilgili problemi kastediyorum. Örneğin, çekirdeğinizde bir if/else bloğunuz varsa, bu durum iş parçacığı sapması olarak bilinir ve normal bir durumda, iş parçacığının boşta kalmasına ve bazılarının bazı yönergeleri yürütmesine neden olur. Örnek Kitap, Bölüm 5, Konu İşbirliği ile

CUDA:

Ama __syncthreads durumunda

(), sonuç biraz trajiktir. CUDA Mimarisi hiçbir iplik

Yani, bir çekirdek içinde ipler senkronizasyon ayrılmasından kaynaklanmaktadır() __syncthreads yürüttü blokta her iş parçacığı kadar __syncthreads() ötesinde bir talimat ilerlemek edeceğini garanti eder. Burada bu konu hakkında çok güzel bir soru/cevap bulabilirsiniz: Can I use __syncthreads() after having dropped threads? Final notu, ben de kötü uygulama ve hiçbir sorun ortaya çıktığı kullandım gibi

ama sorunlar ileride doğabilecek garantisi yoktur .

+2

Beklenmeyen davranışlar hakkında ne demek istiyorsun, sorun nedir? Bunu derslerde görmüştüm ve bunu da kullandım ve şu ana kadar hiçbir sorun çıkmadı. –

+0

Lütfen talebiniz için bir referans verin. – RoBiK

+0

@GeorgeAprilis Sorun temelde _good uygulamaları_ ve bir blok içinde gelecekteki senkronizasyon ile ilgilidir. – pQB