cuda,addAtomic产生奇数结果

时间:2016-09-26 01:58:03

标签: cuda

我遇到的情况是addAtomic没有像我预期的那样执行。我对cuda很新,所以我可能会遗漏一些东西,但是我已经被困在这几天了,并且重写了我程序的大多数其他方面,认为这是一个内存分配问题。但事实并非如此。

基本上发生的事情是它调用'analyze'内核,它应该产生数据的最小值/最大值和总和值。相同的数据用于最小值/最大值作为总和。但是,来自atomicadd操作的结果读起来就像是一个内存地址。非常大的数字。有没有我缺少的东西 - 我已经超过了这一百次,除了最小值/最大值和总和之外,几乎所有内容都被删除了。

__global__ void analyze(int *data, int *min, int *max, int *mean)
{
    int t_id = (threadIdx.x * AXIS_COUNT) + blockIdx.x;
    int b_id = blockIdx.x;

    int localVal = data[t_id];
    atomicMin(&min[b_id], localVal);
    atomicMax(&max[b_id], localVal);
    atomicAdd(&mean[b_id], localVal);
}
    ...........
    int r;
    int step = WINDOW_LENGTH * AXIS_COUNT;
    for (r = 0; r < out_rows; r++){
        analyze<<<AXIS_COUNT, WINDOW_LENGTH>>>(
                                                &d_data[r * step], 
                                                &d_min[r * AXIS_COUNT], 
                                                &d_max[r * AXIS_COUNT],
                                                &d_mean[r * AXIS_COUNT]);
    }

    cudaDeviceSynchronize();

    cudaMemcpy(h_min, d_min, int_size, cudaMemcpyDeviceToHost);
    cudaMemcpy(h_max, d_max, int_size, cudaMemcpyDeviceToHost);
    cudaMemcpy(h_mean, d_mean, int_size, cudaMemcpyDeviceToHost);
    for(r=0; r < out_rows; r++) {
        fprintf(stderr, "mean %d, x: %d, y: %d z: %d\n", r, h_mean[r*AXIS_COUNT], h_mean[r*AXIS_COUNT + 1], h_mean[r*AXIS_COUNT+2]);
    }

结果如下:

mean 5025, x: 2078310793, y: 1999653847 z: -1453684997
mean 5026, x: 2078308025, y: 1999646363 z: -1453660854
mean 5027, x: 2078305391, y: 1999639383 z: -1453636904
mean 5028, x: 2078304342, y: 1999630356 z: -1453613212

我已经验证并检查了最小/最大值以及相关文件以确认。

1 个答案:

答案 0 :(得分:-3)

答案是初始化内核中的共享内存。

__shared__ double sum[AXIS_COUNT];
    if (threadIdx.x == 0) {
        int i;
        for (i=0; i < AXIS_COUNT; i++) 
            sum[i] = 0;
    }


    syncthreads();
    int t_id = (threadIdx.x * AXIS_COUNT) + blockIdx.x;
    int b_id = blockIdx.x;