【问题标题】:CUDA double matrix overflowCUDA 双矩阵溢出
【发布时间】:2016-12-12 12:17:26
【问题描述】:

我编写了一个程序,将给定矩阵的元素加倍,如果我将矩阵大小更改为 500,它将由于溢出而“停止工作”,有人能帮我理解为什么吗? (它适用于 100)

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

#include <stdio.h>
#include <stdlib.h>
__global__ void kernel_double(int *c, int *a)
{
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    c[i] = a[i] * 2;
}
int main()
{
    const int size = 100; 
    // failed when size = 500, Unhandled exception at 0x00123979 in
    // doublify.exe: 0xC00000FD: 
    // Stack overflow (parameters: 0x00000000, 0x00602000).
    int a[size][size], c[size][size];
    int sum_a = 0;
    int sum_c = 0;

    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            a[i][j] = rand() % 10;
            sum_a += a[i][j];
        }
    }
    printf("sum of matrix a is %d \n", sum_a);

    int *dev_a = 0;
    int *dev_c = 0;
    cudaMalloc((void**)&dev_c, size * size * sizeof(int));
    cudaMalloc((void**)&dev_a, size * size * sizeof(int));
    cudaMemcpy(dev_a, a, size * size * sizeof(int), cudaMemcpyHostToDevice);
    printf("grid size %d \n", int(size * size / 1024) + 1);
    kernel_double << <int(size * size / 1024) + 1, 1024  >> >(dev_c, dev_a);
    cudaDeviceSynchronize();
    cudaMemcpy(c, dev_c, size * size * sizeof(int), cudaMemcpyDeviceToHost);
    cudaFree(dev_c);
    cudaFree(dev_a);
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            sum_c += c[i][j];
        }
    }
    printf("sum of matrix c is %d \n", sum_c);
    return 0;
} 

这是 size 等于 100 时的输出:

sum of matrix a is 44949
grid size 10
sum of matrix c is 89898
Press any key to continue . . .

我的开发环境是MSVS2015 V14、CUDA8.0和GTX1050Ti

【问题讨论】:

    标签: c++ visual-studio cuda


    【解决方案1】:

    由于您声明了 2 个局部变量数组,每个数组包含 250,000 个元素,因此您会遇到大小为 500 的堆栈溢出。这大约需要 2MB 的堆栈空间。

    您可以提供一个链接器选项来增加初始堆栈大小,但更好的解决方案是为您的数组动态分配空间。 (您可以创建一个包含数组的类,然后分配该类的一个实例。)

    例如,在您的 main 函数之前添加一个新结构:

    struct mats {
        int a[size][size];
        int c[size][size];
    };
    

    然后,在您的 main 中,删除 ac 数组,并将其替换为

    auto ary = std::make_unique<mats>();
    

    在您引用ac 的任何地方,请改用ary-&gt;aary-&gt;c。 (unique_ptr 会在ary 超出范围时自动删除分配的内存。)

    【讨论】:

    • 您能否详细说明一下这个动态分配方面,比如提供一些示例代码?我是 C++ 新手,因此非常感谢您提供更多详细信息!
    • 如果你想创建一个连续的二维动态数组(我相信你需要这样)see this。将分配从new[]更改为CUDA分配函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2021-11-30
    • 2012-05-06
    • 2013-11-04
    • 2016-08-03
    • 2016-11-17
    • 1970-01-01
    相关资源
    最近更新 更多