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]++;
}
}
}
、私を助けてください。
atomicInc()を使用する必要があります。 CUDA_C_Programming_Guide.pdf、セクションB.11.1.6を参照してください。付録F.1をチェックして、正しいカードを持っていることを確認してください。 –