我只是盯着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沒有安裝在我的系統上。
當我運行你的代碼時,它打印出3,5,7,11。你確定你沒有遇到任何運行時錯誤嗎?我在代碼中看不到API錯誤檢查。可以添加它或使用cuda-memcheck。 – talonmies
這非常奇怪,當我運行我的代碼時,它會打印3,4,5,6 – kpie
您的系統配置已損壞。通常cuda-memcheck會指出這一點,但在這種情況下,不會。這將需要一些疑難解答來找出原因。下一步是在該系統上運行'nvidia-smi',並查看它報告的內容。如果它似乎報告事情正常,那麼您將需要嘗試正確的CUDA錯誤檢查,您可以將其添加到您的代碼中,或者運行其中一個CUDA示例代碼,如vectorAdd。最後,您可能想要在該系統上獲得'dmesg | grep NVRM'的輸出。 –