2016-09-21 12 views
0

私はちょうど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 partsCUDA 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エラーチェックを行うか、コードに追加するか、vectorAddなどのCUDAサンプルコードを実行する必要があります。最後に、おそらく 'dmesg | grep NVRM'の出力をそのシステムで取得したいと思うでしょう。 –

答えて

0

nvidia-cuda-toolkitをインストールすると、cudaはインストールされません。

cudaフォームnvidia's websiteをインストールできます。 (* .debを使用)

+1

.debを使用する特別な理由はありません。 CUDAをインストールしようとする前に、特にこれまでやっていないのであれば、問題のプラットフォーム(この場合はlinux)のCUDAインストールガイドを読むことをお勧めします。パッケージマネージャメソッド(.deb)と実行ファイルインストーラメソッドの両方が実行可能ですが、それぞれ正しく実行する必要があります。インストールガイドには、正しい方法と使用方法が記載されています。 –

+0

私はインストールガイドを使用しましたが、.runファイルはコンピュータを文鎮に2回回しました。私は自分の能力を最大限引き出すためにインストールガイドをたどりましたが、おそらく私は間違いを犯しましたが、私の経験から、CUDAをubuntu 16.04にインストールする人は.runではなくdebを使用することをお勧めします。さらに、.runファイルが自動アップデートのスコープ外であることを読んだ。つまり、.debをインストールすると保守が少なくて済むということだ。 – kpie

関連する問題