-1

文字列の比較に関する簡単なコードを書きます。コードは次のようになります。とても簡単です。文字列aと文字列bを比較するだけです。対応する要素が同じ場合は、新しい行列sに5を割り当てます。対応する要素が異なる場合は、新しい行列に-3を割り当てます。コンパイルエラーはありません。しかし、結果は私が期待したものではありません。いくつかの有用な提案をください。ありがとうございました!

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "book.h"
#define M 6
#define BLOCK_SIZE 30 // maximum 1024 threads per block
#define GRID_SIZE 30 // 900 blocks per grid
#define P (900 * 900)

void Init();


char *gpu_a;
char *gpu_b;
float *gpu_s;
float *cpu_s;


char cpu_a[6] = {'A', 'T', 'G', 'C', 'G', 'T'};
char cpu_b[6] = {'G', 'T', 'G', 'A', 'T', 'G'};

void cpu_Allocate1dArray()
{
   //cpu_a = (char*) malloc( M * sizeof( char) );
   //cpu_b = (char*) malloc( M * sizeof(char) );
   cpu_s = (float*) malloc( M * sizeof( float) );
}

void gpu_Allocate1dArray()
{
    cudaMalloc( (void**)&gpu_a, M * sizeof(char) );
    cudaMalloc( (void**)&gpu_b, M * sizeof(char) );
cudaMalloc( (void**)&gpu_s, M * sizeof(float));
}


__global__ void mykernel( char *gpu_a, char *gpu_b, float *gpu_s)
{
    int i , j , tid;
    i = threadIdx.x + blockIdx.x * blockDim.x;
j = threadIdx.y + blockIdx.y * blockDim.y;
    tid = i + j * blockDim.x * gridDim.x;
    if ( tid  < P)
{
       if( gpu_a[i] == gpu_b[j])
        {
      gpu_s[tid] = 5;
    }
       else
    gpu_s[tid] = -3;
    }         
}


int main()
{
   int q;
   cpu_Allocate1dArray();
   gpu_Allocate1dArray();

   Init();

   dim3 gridDim;
   dim3 blockDim;

   blockDim.x = blockDim.y = BLOCK_SIZE;
   gridDim.x = gridDim.y = GRID_SIZE;

   cudaMemcpy( gpu_a, cpu_a, sizeof(char) * M, cudaMemcpyHostToDevice);
   cudaMemcpy( gpu_b, cpu_b, sizeof(char) * M, cudaMemcpyHostToDevice);
   mykernel<<<gridDim, blockDim>>>(gpu_a, gpu_b, gpu_s);
   cudaMemcpy( cpu_s, gpu_s, sizeof(float)* M, cudaMemcpyDeviceToHost);

   for (q = 0; q < M; q++)
       printf("%f ", cpu_s[q]);


   printf("\n");    

    //Free device memory

    free(cpu_s);

    cudaFree(gpu_s);

    cudaFree(gpu_a);
    cudaFree(gpu_b); 

    return 0;

}        

void Init()
{
   int i;
   for (i = 0; i < M; i++)

   cpu_s[i] = 0;
}

結果は次のとおりです。[Smith@server] $ ./test88.exe 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000

4

1 に答える 1

2

あなたのコードは配列の長さを超えようとしています - gpu_s の長さは 6 * sizeof(float) ですが、tid は最大 900*900 です。

P を 6 に設定すると、-3.000000 -3.000000 5.000000 -3.000000 5.000000 -3.000000 が出力されます。

注 - cuda-memcheckを使用してアプリケーションを実行すると、このような問題を簡単に検出できます。

于 2012-12-06T23:33:11.383 に答える