2012-10-26 3 views
0

특정 입력에 대해 cuda-gdb를 사용하여 실행할 때 장치 Illegal Address로 인해 커널 시작 오류가 발생했습니다. 나는 그것을 사용하여 cuda - memcheck을 실행하고 잘못된 4 크기의 오류 쓰기. 코드가 너무 커서 여기서 시나리오를 설명합니다.CUDA에서 크기 4를 잘못 입력했습니다.

스택으로 사용되는 배열 포인터를 전달하는 주 커널이 있습니다. 주 커널에서 호출하여 스택을 사용하는 장치 기능이 있습니다.

__device__ void find(int v , int* p, int* pv,int n, int* d_stackContents) 
{ 

    int d_stackTop; 
    d_stackTop = -1; 
    *pv = p[v]; 
    if(*pv == -1){ 
      *pv = v; 

    } 
    else{ 
    cuPrintf("Stack top is %d\n",d_stackTop); 
    d_stackTop = d_stackTop + 1; 
    d_stackContents[d_stackTop] = v; 
    cuPrintf("Stack top is %d\n",d_stackTop); 
    while(*pv != -1){ 
      d_stackTop = d_stackTop + 1; 
      d_stackContents[d_stackTop] = *pv; 
      cuPrintf("Stack top is %d\n",d_stackTop); 
      *pv = p[*pv]; 
    } 

} 

d_stackContents [d_stackTop] = * pv;에서 오류가 발생했습니다. 다음

는 I 메인 커널 장치 함수를 호출하고 :

찾기 (V [IDX, P, & PV, N, d_stackContents)를;

여기서 idx = threadIdx.x + blockDim.x * blockIdx.x 그리고 pv를 int pv로 선언했습니다.

또한, d_stackContents 배열은 주 사용 cudaMalloc에 ​​할당하고 단일 블록에서 단일 스레드와 커널을 호출하지 않는 한이 작동하지 않습니다 메인 커널

답변

4

에 인수로 전달됩니다. 그렇지 않으면 모든 스레드가 서로의 스택을 쓸어 넘깁니다. 손상된 스택에 저장된 포인터를 역 참조하면 코드가 잘못된 주소에 액세스하려고하는 이유가 바로 설명됩니다.

스레드마다 별도의 스택을 사용하거나 전역 메모리에있는 스택 포인터가있는 단일 스택을 사용해야합니다.이 스택은 원자 적 조작을 통해서만 조작됩니다.

+0

그는 각 스레드에서'd_stackContents'에 대해 다른 포인터를 전달할 수 있습니다 ... – harrism

관련 문제