gpt4 book ai didi

c++ - CUDA双矩阵溢出

转载 作者:行者123 更新时间:2023-11-28 05:22:50 25 4
gpt4 key购买 nike

我编写了一个程序,将给定矩阵的元素加倍,如果我将矩阵大小更改为 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;
}

这是大小等于 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

最佳答案

你得到一个大小为 500 的堆栈溢出,因为你声明了 2 个局部变量数组,每个数组有 250,000 个元素。这会占用大约 2MB 的堆栈空间。

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

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

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

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

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

在你引用ac 的任何地方,请改用ary->aary->c。 (当 ary 超出范围时,unique_ptr 将自动删除分配的内存。)

关于c++ - CUDA双矩阵溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41093967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com