CUDA专柜信

时间:2012-04-14 23:26:35

标签: c cuda char int

我遇到了CUDA的问题。我想制作一个小程序来计算char数组中的字母。

我从文件中读取字母并保存到名为N的int变量,读取了多少个字母。之后我是malloc。

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

在malloc之后我再次读取文件并将当前字母分配给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);

好的,请选择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]);

它不起作用。在char数组我有句:超级testSuper测试;我正在寻找'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]++;
    }
}
}

请帮助我。

1 个答案:

答案 0 :(得分:2)

我猜N的足够小,以至于你的GPU能够并行启动所有线程。因此,您为数组中的每个字符启动一个线程。所有同时运行的线程都看不到彼此的输出。相反,每个线程读取a [0]的值(即0),并将其增加1并存储结果值(1)。如果这是家庭作业,那将是教授想要传授的基本教训。

当多个线程同时在同一位置存储值时,未定义哪个线程将存储其值。在您的情况下,这无关紧要,因为存储值的所有线程都将存储值“1”。

一个典型的解决方案是让每个线程在一个单独的位置存储0或1的值(取决于是否存在匹配),然后在单独的步骤中将值相加。

您还可以使用原子增加操作。