2012-04-14 4 views
1

CUDAに問題があります。 charの配列から文字を数える小さなプログラムを作ってみたい。CUDAカウンターレター

ファイルから文字を読み込んで、Nというint変数に保存します。何文字読みますか?その後、私はmalloc。私は(それが動作)再びファイルとchar配列の要素に現在の文字を割り当て読んmallocの後

char *b_h, *b_d; 
size_t size_char = N * sizeof(char); 
b_h = (char *)malloc(size_char); 

int j=0; 
while(fscanf(file,"%c",&l)!=EOF) 
{ 
    b_h[j]=l; 
    j++; 
} 

その後、私はint型の変数(A_H)を作成するカウンタなど。

int *a_h, *a_d; 
size_t size_count = 1*sizeof(int); 
a_h = (int *)malloc(size_count); 

[OK]を、CUDAに行く:ホストからデバイスへ

cudaMalloc((void **) &a_d, size_count); 
cudaMalloc((void **) &b_d, size_char); 

コピー:

cudaMemcpy(a_d, a_h, size_count, cudaMemcpyHostToDevice); 
cudaMemcpy(b_d, b_h, size_char, cudaMemcpyHostToDevice); 

セットのブロックをし、CUDA関数を呼び出す:

int block_size = 4; 
int n_blocks = N/block_size + (N%block_size == 0 ? 0:1); 
square_array <<< n_blocks, block_size >>> (a_d,b_d,c_d, N); 

は、関数からの受信:

cudaMemcpy(a_h, a_d, size_count, cudaMemcpyDeviceToHost); 
cudaMemcpy(b_h, d_d, size_char, cudaMemcpyDeviceToHost); 

そして、印刷回数:

printf("\Count: %d\n", a_h[0]); 

そして、それは動作しません。チャーの配列で私は文を持っている:スーパーテストスーパーテスト;私は 'e'の手紙を探しています。私はa_h [0] = 1を得ました。 どこに問題がありますか?

CUDA機能:

__global__ void square_array(int *a, char *b, int *c, int N) 
{ 
const char* letter = "e"; 

int idx = blockIdx.x * blockDim.x + threadIdx.x; 

if (idx<N) 
{ 
    if(b[idx] == *letter) 
    { 
     a[0]++; 
    } 
} 
} 

、私を助けてください。

+0

atomicInc()を使用する必要があります。 CUDA_C_Programming_Guide.pdf、セクションB.11.1.6を参照してください。付録F.1をチェックして、正しいカードを持っていることを確認してください。 –

答えて

2

あなたのGPUがすべてのスレッドを並行して起動できるように、Nは十分小さいと思います。したがって、配列内の各文字のスレッドを開始します。すべて同時に実行されているスレッドには、互いに出力が表示されません。代わりに、各スレッドはa [0]の値(0)を読み取り、1だけ増加させて結果の値(1)を格納します。これが宿題であれば、それは教授が伝えたい基本的な教訓でした。

複数のスレッドが同時に同じ場所に値を格納する場合、どのスレッドがその値を格納するかは未定義です。あなたのケースでは、値を格納するすべてのスレッドが値 "1"を格納するので、それは重要ではありません。

典型的な解決策は、別の場所に一致または不一致があるかどうかに応じて0または1の値を格納し、別の手順で値を加算することです。

アトミック増加操作を使用することもできます。

+0

あなたが言ったように私はそれをしました。 – user1333885