包含式扫描不一致-有时输出正确答案CUDA

时间:2019-04-28 16:32:21

标签: parallel-processing cuda

我正在为Udacity课程学习“并行编程入门”。我对希尔斯斯蒂尔​​扫描(包含性扫描)的解决方案不一致,因此我不确定是否错过了某个地方的同步!

我使用的BLOCK_SIZE为32,当我在长度= <1024的数组上运行扫描时,答案几乎总是正确的。 但是,在2048个数组上,它偶尔会返回不正确的结果,因为当我增加数组中的项目数时,结果以不正确的速度增加是不正确的。

我尝试使用不同的块大小,试图分配更多的内存,认为这可能是问题所在,花了很多时间在网上寻找资源,但找不到任何东西!

内核:

__global__ void scanHillisSteele(int *d_out, int *d_in, const int n) {
    unsigned int i = threadIdx.x + blockDim.x * blockIdx.x;
    if (i < n) {

        for (int offset = 1; offset < n; offset <<= 1) {
            int temp;
            if (i >= offset) {
                temp = d_in[i - offset];
            }

            __syncthreads();

            if (i >= offset) {
                d_in[i] = temp + d_in[i];
            }

            __syncthreads();
        }
        d_out[i] = d_in[i];
    }
}

启动内核

    scanHillisSteele << <ARRAY_SIZE/BLOCK_SIZE,BLOCK_SIZE, 2* (ARRAY_BYTES/BLOCK_SIZE) >> > (d_out, d_in, ARRAY_SIZE);
    cudaDeviceSynchronize();

被扫描的目标只是一个长度为ARRAY_SIZE的数组,填充为1。 输出数组中的最后一个元素应为== ARRAY_SIZE 例如 在2048个元素的数组上运行时,输出应为

[1,2,3,4,5....2047,2048]

但是有时它可能会输出为[1,2,3.....2033,2034]

我注意到输出数组中的某些元素是重复的,例如[1,2,3,3,3,3,4....]

0 个答案:

没有答案