【问题标题】:CUDA not returning values when Array > 1769472当 Array > 1769472 时 CUDA 不返回值
【发布时间】:2015-03-05 10:30:28
【问题描述】:

我正在尝试计算平均 256 组 8192 字节长的数据。我有一个可在 216 个数据集上工作的内核,但不再有,内核为每个平均值返回 0。我正在使用一个非常基本的归约系统来计算平均值。

显卡:GTX 780 Ti

这是我的代码

__global__ void Average(double *Input, int Length, int Sets, double *Average, int N) {
    unsigned int Pos = (blockDim.x * blockIdx.x) + threadIdx.x;
    unsigned int Offset;
    int i = Length / N;
    if (Pos < i * Sets) {
        Offset = ((Pos / i) * Length) + (Pos % i); 
        Input[Offset] += Input[Offset + i];
    }
    __syncthreads();
    if (N == Length) {
        Average[Pos] = Input[Pos*Length] / Length;
    }
}

using namespace std;
int main()
{
    const int Length = 8192;
    const int Sets =256;
    const int Width = Length*Sets;
    double *GPU_Average, *GPU_Data;
    cudaMalloc((void**)&GPU_Average, CameraWidth*sizeof(double)*Sets);
    cudaMalloc((void**)&GPU_Data, CameraWidth*sizeof(double)*Width); 
    double CPU_Data[Width];
    double CPU_Average[Sets];
    for (int i = 0; i < Width; i++) {
        CPU_Data[i] = i;
    }
    cudaMemcpy(GPU_Data, CPU_Data, sizeof(double)*Width, cudaMemcpyHostToDevice);

    int N = 2;
    int Total, Blocks, Threads;
    while (N < Length+1) {
        Total = (Sets*Length) / N;
        if (Total > 1024) {
            Threads = 1024;
            Blocks = Total / Threads;
        }
        else {
            Threads = Total;
            Blocks = 1;
        }
        Average << < Blocks, Threads>> >(GPU_Data, Length, Sets, GPU_Average, N);
        N *= 2;
    }
    cudaMemcpy(CPU_Average, (GPU_Average), sizeof(double)*Sets, cudaMemcpyDeviceToHost);
    return 0;
}

感谢您对此问题的任何帮助。

【问题讨论】:

  • 您确定您的 CPU 堆栈是否足够大以首先容纳 main() 中的两个数组?您是否检查过 GPU 上简单而简单的“将输入复制到输出”是否有效?
  • 嗨 Angew,在您提出建议的过程中,我发现了导致问题的原因,我正在分配内存并使用可变宽度两次,因此导致内存错误,这在代码中看不到以上,因为我在发布之前稍微更改了它。
  • 在这种情况下,您应该编辑问题以匹配您的实际代码(并编辑您的答案以匹配)。

标签: c++ cuda nvidia


【解决方案1】:

在我写的实际代码(不是上面那个)中我没有意识到

 cudaMalloc((void**)&GPU_Data, Width*sizeof(double)*Width); 

而不是

 cudaMalloc((void**)&GPU_Data, sizeof(double)*Width); 

这分配了太多内存并导致错误。

【讨论】:

    猜你喜欢
    • 2018-11-07
    • 2018-08-16
    • 2019-02-19
    • 2014-01-15
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多