在CUDA中,我无法获得有效的价值

时间:2016-07-12 07:42:41

标签: cuda

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>
#include <stdlib.h>

#define NUMBEROFMX 256*64

__global__ void reduce0(int *g_idata, int *g_odata)
{
    extern __shared__ int sdata[];
    unsigned int tid = threadIdx.x;
    unsigned int i = blockIdx.x * blockDim.x + threadIdx.x;
    sdata[tid] = g_idata[i];
    __syncthreads();


    for (unsigned int s = 1; s < blockDim.x; s *= 2)
    {
        if (tid % (2 * s) == 0)
        {
            sdata[tid] += sdata[tid + s];
        }
        __syncthreads();
    }
    if (tid == 0)
    {
        g_odata[blockIdx.x] = sdata[0];
    }
}

int main()
{
    int *A;
    int *B;
    int *dev_A;
    int *dev_B;


    A = (int*)malloc(sizeof(int) * NUMBEROFMX);
    B = (int*)malloc(sizeof(int) * NUMBEROFMX);

    cudaMalloc((void**)&dev_A, sizeof(int)*NUMBEROFMX);
    cudaMalloc((void**)&dev_B, sizeof(int)*NUMBEROFMX);

    for (int i = 0; i < NUMBEROFMX; i++)
    {
        A[i] = 1;
    }

    cudaMemcpy(dev_A, A, sizeof(int)*NUMBEROFMX, cudaMemcpyHostToDevice);
    reduce0 << <256, 64 >> >(dev_A, dev_B);
    cudaMemcpy(B, dev_B, sizeof(int)*NUMBEROFMX, cudaMemcpyDeviceToHost);
    printf("%d\n", B[0]);
}

我研究CUDA编程。这段代码没有完成,但是我想用树减少的数组总和来编写代码。我希望在B [0]中获得64但是B [0]的值无效。  当我使用NSIGHT调试此代码时,g_odata [0]为64.但是B [0]无效。我不知道为什么。

1 个答案:

答案 0 :(得分:2)

如果您使用proper CUDA error checking或使用cuda-memcheck运行代码,则会发现非法使用共享内存(超出范围的共享或本地地址)。

对于您尝试使用的动态共享内存,您需要在内核调用中指定每个块的共享内存大小:

reduce0<<<256, 64, 64*sizeof(int)>>>(dev_A, dev_B);

通过此更改,您的内核可以按预期工作。

有关共享内存的更多背景信息,请参阅博文Using Shared Memory in CUDA C/C++