CUDA第一次机会异常堆栈溢出错误

时间:2014-06-24 04:27:16

标签: c++ cuda stack overflow heap

CUDA / C ++ noob。

我在尝试调试我的CUDA项目时收到的错误是:

First-chance exception at 0x000000013F889467 in simple6.exe: 0xC00000FD: Stack overflow (parameters: 0x0000000000000001, 0x0000000000223000).

The program '[2668] simple6.exe' has exited with code 0 (0x0).

从网络研究来看,似乎我有一些对"stack"而言过大的大变量需要转移到"heap"

有人可以提供适当的代码修改吗?

我的代码如下。这个内核的目的是使用h_Sh_TM来创建一堆值,并在最后将这些值写入h_F。这就是为什么h_F永远不会复制到GPU中的原因。

int main()
{

int blockSize= 1024; 
int gridSize = 1; 

const int reps = 1024; 
const int iterations = 18000; 


int h_F [reps * iterations] = {0};
int h_S [reps] = {0}; // not actually zeros in my code this just simplifies things
int h_TM [2592] = {0} // not actually zeros in my code this just simplifies things

// Device input vectors
float *d_F;
double *d_S;
float *d_TM;

//Select GPU
cudaSetDevice(0);


// Allocate memory for each vector on GPU

cudaMalloc((void**)&d_F, iterations * reps * sizeof(float));
cudaMalloc((void**)&d_S, reps * sizeof(double));
cudaMalloc((void**)&d_TM, 2592 * sizeof(float));

// Copy host vectors to device
cudaMemcpy( d_S, h_S, reps * sizeof(double), cudaMemcpyHostToDevice);
cudaMemcpy( d_TM, h_TM, 2592 * sizeof(float), cudaMemcpyHostToDevice);

// Execute the kernel
myKern<<<gridSize, blockSize>>>(d_TM, d_F, d_S, reps);
cudaDeviceSynchronize(); 


// Copy array back to host
cudaMemcpy( h_F, d_F, iterations * reps * sizeof(float), cudaMemcpyDeviceToHost );

// Release device memory
cudaFree(d_F);
cudaFree(d_TM);
cudaFree(d_S);

cudaDeviceReset();
return 0;

此外,相关,但会使这些巨大的输入数组“共享”变量解决我的问题?

非常感谢。

1 个答案:

答案 0 :(得分:0)

所以我读完了你的代码,看起来这3个数组中只有一个实际上会导致堆栈溢出错误。这是假设您的销售代表不会变得太大。导致问题的数组是h_F。你所要做的就是声明h_F,以便它被放置在堆而不是堆栈上,正如你所说的那样。

这实际上是一线改变。

简单地声明h_F如下:

float *h_F = new float[(reps * iterations)];
祝你好运!