我遇到了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]++;
}
}
}
请帮助我。
答案 0 :(得分:2)
我猜N的足够小,以至于你的GPU能够并行启动所有线程。因此,您为数组中的每个字符启动一个线程。所有同时运行的线程都看不到彼此的输出。相反,每个线程读取a [0]的值(即0),并将其增加1并存储结果值(1)。如果这是家庭作业,那将是教授想要传授的基本教训。
当多个线程同时在同一位置存储值时,未定义哪个线程将存储其值。在您的情况下,这无关紧要,因为存储值的所有线程都将存储值“1”。
一个典型的解决方案是让每个线程在一个单独的位置存储0或1的值(取决于是否存在匹配),然后在单独的步骤中将值相加。
您还可以使用原子增加操作。