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_S
和h_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;
此外,相关,但会使这些巨大的输入数组“共享”变量解决我的问题?
非常感谢。
答案 0 :(得分:0)
所以我读完了你的代码,看起来这3个数组中只有一个实际上会导致堆栈溢出错误。这是假设您的销售代表不会变得太大。导致问题的数组是h_F。你所要做的就是声明h_F,以便它被放置在堆而不是堆栈上,正如你所说的那样。
这实际上是一线改变。
简单地声明h_F如下:
float *h_F = new float[(reps * iterations)];
祝你好运!