특정 입력에 대해 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에 할당하고 단일 블록에서 단일 스레드와 커널을 호출하지 않는 한이 작동하지 않습니다 메인 커널
그는 각 스레드에서'd_stackContents'에 대해 다른 포인터를 전달할 수 있습니다 ... – harrism