2010-12-10 32 views
6

çalışmıyor. Asmak için aşağıdaki kodum var.Acemi CUDA - Basit var artım ben CUDA ile bir proje üzerinde çalışıyorum

#include <iostream> 

using namespace std; 

__global__ void inc(int *foo) { 
    ++(*foo); 
} 

int main() { 
    int count = 0, *cuda_count; 
    cudaMalloc((void**)&cuda_count, sizeof(int)); 
    cudaMemcpy(cuda_count, &count, sizeof(int), cudaMemcpyHostToDevice); 
    cout << "count: " << count << '\n'; 
    inc <<< 100, 25 >>> (&count); 
    cudaMemcpy(&count, cuda_count, sizeof(int), cudaMemcpyDeviceToHost); 
    cudaFree(cuda_count); 
    cout << "count: " << count << '\n'; 
    return 0; 
} 

Çıktı sorun nedir

count: 0 
count: 0 

mı?

Şimdiden teşekkürler!

+0

muhtemelen programlama kılavuzunda örneklerden bazıları içinden çalışmalıdır olmalı. Sözdiziminiz programlama kılavuzunda önerilenlerden farklıdır. – Marm0t

cevap

6

çözüm bulundu. Sadece bir atomik fonksiyon kullanmam gerekti, yani diger evrelerin müdahalesi olmaksizin yürütülen bir fonksiyon. işlemin tamamlandığını kadar Başka bir deyişle, başka hiçbir iş parçacığı Belirli bir adresi erişebilir.

Kodu:

#include <iostream> 

using namespace std; 

__global__ void inc(int *foo) { 
    atomicAdd(foo, 1); 
} 

int main() { 
    int count = 0, *cuda_count; 
    cudaMalloc((void**)&cuda_count, sizeof(int)); 
    cudaMemcpy(cuda_count, &count, sizeof(int), cudaMemcpyHostToDevice); 
    cout << "count: " << count << '\n'; 
    inc <<< 100, 25 >>> (cuda_count); 
    cudaMemcpy(&count, cuda_count, sizeof(int), cudaMemcpyDeviceToHost); 
    cudaFree(cuda_count); 
    cout << "count: " << count << '\n'; 
    return 0; 
} 

Çıktı:

count: 0 
count: 2500 

bana işlemekte olduğu hatayı fark yaptığınız için teşekkür ederiz.

8

Çekirdek işlevinize cuda_count'u geçmelisiniz. Bunun dışında, tüm iş parçacıklarınız aynı bellek konumunu artırmaya çalışıyor. Bunun etkisi iyi tanımlanmamıştır (en az bir yazma başarılı olacaktır, ancak birden fazla olabilir).

Yalnızca bir iplik çalışmalarını gerçekleştirmek izin vererek önlemek gerekir:

__global__ void inc(int *foo) { 
    if (blockIdx.x == 0 && threadIdx.x == 0) 
    ++*foo; 
} 

(denenmemiş)

+0

Benim bir başarısızlığım. Yine de çıktı hala yanlış. Bana 1 yerine beklenen 2500 –

+5

@Renato verir: CUDA nasıl çalıştığını bu değil. Güncellenmiş cevabımı görün: Farklı iş parçacıklarından aynı bellek konumuna yazmak için tanımlanmamış. İstediğiniz, toplama operasyonu. Bunu uygulamak, önemsiz değil. –

+0

Hızlı çözümünüzü denedim ancak çıktı 2 idi. –

0

Kodunuzdaki sorun, saymak için işaretçi işaretçisini aygıtın çekirdek işaretçisine geçirmenizdir. Saymak için işaretçi değil. Bir '&' çok fazla

Bu hat

inc <<< 100, 25 >>> (&count); 

inc <<< 100, 25 >>> (count);