2014-06-24 3 views
-1

여기에 CUDA/C++ 멍청한.CUDA 첫 번째 예외 예외 스택 오버플로 오류

내 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; 

또한, 관련 있지만,이 거대한 입력 배열 변수는 내 문제를 해결 " 공유"를 만드는 것?

감사합니다.

+2

죄송합니다. 여기서는 적절한 코드 수정을하지 않습니다. C++에서 동적 메모리 할당에 대해 배우고 싶다면 Google malloc을 사용하거나 C++ new 연산자를 읽으십시오. – talonmies

+0

나는 단지 숟가락 먹이가 아닌 약간의 지침이 필요하다. 내가 올바르게 이해한다면 동적 메모리는 하나의 변수 만 선언 할 수 있기 때문에이 맥락에서 제한적이다. – Jordan

+2

[기본 조건에서 충돌하는 CUDA C 프로그램] (http://stackoverflow.com/questions/20127835/basic-cuda-c-program-curashing-under-certain-conditions)의 복제본이있을 수 있습니다. – JackOLantern

답변

0

그래서 코드를 읽었을 때 그 3 개의 배열 중 하나만 실제로 스택 오버플로 오류를 일으키고있는 것처럼 보입니다. 귀하의 담당자가 너무 크게되지 않는다고 가정합니다. 문제를 일으키는 배열은 h_F입니다. 당신이해야 할 일은 h_F를 선언하여 스택 대신 힙에 배치되도록하는 것입니다.

문자 그대로 한 줄 변경되었습니다.

은 간단하게 다음과 같이 h_F을 선언

float *h_F = new float[(reps * iterations)]; 

행운을 빕니다!

+0

그것은 작동합니다! 고마워, 이걸로 내 머리를 잃어 버리고있어! 이 내용에 대한 문서는 이해하기가 어렵습니다. – Jordan

관련 문제