私はちょうどcudaを見つめていて、ベクトル和チュートリアルを行った後にhere私は実際に自分の足を下に置くために何かを試してみると思っていました。CUDAで素数を生成する際に問題が発生する
これは、ここでのトラブルが単純な修正か、まったく無数の問題かどうかはわかりません。次のように私のコードの
平易な英語の記述がある:
まずメンバーnum個を持ち、カウントcounterClassがあります。 count = 0に設定すると、このカウンタクラスは整数を反復処理するときにnumで割ったときの余りを追跡します。
私は2つの機能を並行して実行します。すべてのカウンタを(並行して)インクリメントする最初の呼び出されたカウントと、カウンタのいずれかが0(並列)を読み取るかどうかをチェックする2番目のカウンタは、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エラーチェックを行うか、コードに追加するか、vectorAddなどのCUDAサンプルコードを実行する必要があります。最後に、おそらく 'dmesg | grep NVRM'の出力をそのシステムで取得したいと思うでしょう。 –