2016-09-21 57 views
0

我只是盯着cuda,然後去了矢量和教程here我以爲我會嘗試從頭開始,真正讓我的腿在我身下。使用CUDA產生質數的麻煩

這就是說我不知道​​這裏的麻煩是一個簡單的修復還是一堆無數的問題。

我的代碼的純英文說明如下:

首先出現的是,有成員NUM和計數在counterClass。當計數等於num時,通過設置count = 0,當我們遍歷整數時,這個計數器類將跟蹤除以num的餘數。

我有兩個函數,我想並行運行。第一個被調用的計數將增加我所有的計數器(並行),第二個將檢查是否有任何計數器讀取0(並行)如果計數器讀取0,則num等於n,這意味着n不是質數。

雖然我想我的代碼僅打印質數,它打印所有的數字...

下面的代碼:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct{ 
    int num; 
    int count; 
} counterClass; 

counterClass new_counterClass(counterClass aCounter, int by, int count){ 
    aCounter.num = by; 
    aCounter.count = count%by; 
    return aCounter; 
} 

__global__ void count(counterClass *Counters){ 
    int idx = threadIdx.x+blockDim.x*blockIdx.x; 
    Counters[idx].count+=1; 
    if(Counters[idx].count == Counters[idx].num){ 
     Counters[idx].count = 0; 
    } 
    __syncthreads(); 
} 

__global__ void check(counterClass *Counters, bool *result){ 
    int idx = threadIdx.x+blockDim.x*blockIdx.x; 
    if (Counters[idx].count == 0){ 
     *result = false; 
    } 
    __syncthreads(); 
} 

int main(){ 
    int tPrimes = 5; // Total Primes to Find 
    int nPrimes = 1; // Number of Primes Found 
    bool *d_result, h_result=true; 
    counterClass *h_counters =(counterClass *)malloc(tPrimes*sizeof(counterClass)); 
    h_counters[0]=new_counterClass(h_counters[0], 2 , 0); 
    counterClass *d_counters; 
    int n = 2; 
    cudaMalloc((void **)&d_counters, tPrimes*sizeof(counterClass)); 
    cudaMalloc((void **)&d_result, sizeof(bool)); 
    cudaMemcpy(d_counters, h_counters, tPrimes*sizeof(counterClass), cudaMemcpyHostToDevice); 
    while(nPrimes<tPrimes){ 
     h_result=true; 
     cudaMemcpy(d_result, &h_result, sizeof(bool), cudaMemcpyHostToDevice); 
     n+=1; 
     count<<<1,nPrimes>>>(d_counters); 
     check<<<1,nPrimes>>>(d_counters,d_result); 
     cudaMemcpy(&h_result, d_result, sizeof(bool), cudaMemcpyDeviceToHost); 
     if(h_result){ 
      printf("%d\n", n); 
      cudaMemcpy(h_counters, d_counters, tPrimes*sizeof(counterClass), cudaMemcpyDeviceToHost); 
      h_counters[nPrimes]=new_counterClass(h_counters[nPrimes], n , 0); 
      nPrimes += 1; 
      cudaMemcpy(d_counters, h_counters, tPrimes*sizeof(counterClass), cudaMemcpyHostToDevice); 
     } 
    } 
} 

有一些類似的問題CUDA - Sieve of Eratosthenes division into parts和很好的例子張貼作爲尋求改善他們的代碼的人的問題,CUDA Primes Generation & Low performance in CUDA prime number generator但通過閱讀這些並沒有幫助我弄清楚我的代碼出了什麼問題!

如何更有效地調試時使用CUDA的,將不勝感激任何意見,如果你能指出什麼我做錯了(因爲我知道這是不是電腦故障),你將有我的尊重永遠。

編輯:

顯然這個問題只發生對我來說也許是我跑我的代碼

$ nvcc parraPrimes.cu -o primes 
$ ./primes 
3 
4 
5 
6 

額外使用CUDA的MEMCHECK推薦的方式... ...:

$ cuda-memcheck ./primes 
========= CUDA-MEMCHECK 
3 
4 
5 
6 
========= ERROR SUMMARY: 0 errors 

dmesg |grep NVRM從該輸出如下::

[ 3.480443] NVRM: loading NVIDIA UNIX x86_64 Kernel Module 304.131 Sun Nov 8 21:43:33 PST 2015 

Nvidia-smi沒有安裝在我的系統上。

+2

當我運行你的代碼時,它打印出3,5,7,11。你確定你沒有遇到任何運行時錯誤嗎?我在代碼中看不到API錯誤檢查。可以添加它或使用cuda-memcheck。 – talonmies

+0

這非常奇怪,當我運行我的代碼時,它會打印3,4,5,6 – kpie

+2

您的系統配置已損壞。通常cuda-memcheck會指出這一點,但在這種情況下,不會。這將需要一些疑難解答來找出原因。下一步是在該系統上運行'nvidia-smi',並查看它報告的內容。如果它似乎報告事情正常,那麼您將需要嘗試正確的CUDA錯誤檢查,您可以將其添加到您的代碼中,或者運行其中一個CUDA示例代碼,如vectorAdd。最後,您可能想要在該系統上獲得'dmesg | grep NVRM'的輸出。 –

回答

0

安裝nvidia-cuda-toolkit的安裝不安裝cuda。

您可以安裝cuda表格nvidia's website。 (*使用.deb)

+1

沒有特別的原因需要使用.deb。在嘗試安裝CUDA之前,尤其是如果您之前沒有這樣做,我會建議閱讀有關平臺的CUDA安裝指南(即本例中的linux)。包管理器方法(.deb)和runfile安裝程序方法都是可行的,但每個方法都必須正確完成。安裝指南爲每個提供了正確的方法和用法。 –

+0

我使用了安裝指南,.run文件將我的電腦變成了鎮紙兩次。我遵循安裝指南盡我所能,也許我犯了一個錯誤,但從我的經驗來看,我會建議任何在Ubuntu 16.04上安裝CUDA的人都使用deb而不是.run。另外我讀過.run文件超出了自動更新的範圍,這意味着使用.deb安裝不需要維護。 – kpie