커널 시작에 문제가 있습니다. 하나의 큰 커널을 사용하는 프로그램이있었습니다. 이제 동기화 문제로 2 개로 분할해야했습니다. 첫 번째 커널은 일부 init 작업을 수행하고 두 번째 커널에 전달 된 인수의 하위 집합을 전달받습니다. 첫 번째 커널 만 실행하면 문제가 없습니다. 두 번째 커널 만 실행하면 초기화가 누락되어 실행하는 동안 실패하지만 커널 자체가 시작됩니다. 두 행을 모두 실행하면 두 번째 커널이 "잘못된 인수"오류로 실패합니다. 필요한 경우 코드를 제공 하겠지만 지금 당장 어떻게 도움이 될지 알 수는 없습니다. 미리 감사드립니다.두 번째 커널에서 cuda "invalid argument"오류가 발생했습니다.
편집 : 여기에 요청 된 실행 코드 :이 일을하기 때문에 하나의 커널을 사용하는 경우
void DeviceManager::integrate(){
assert(hostArgs->neighborhoodsSize > 0);
size_t maxBlockSize;
size_t blocks;
size_t threadsPerBlock;
// init patch kernel
maxBlockSize = 64;
blocks = (hostArgs->patchesSize /maxBlockSize);
if(0 != hostArgs->patchesSize % maxBlockSize){
blocks++;
}
threadsPerBlock = maxBlockSize;
std::cout << "blocks: " << blocks << ", threadsPerBlock: " << threadsPerBlock << std::endl;
initPatchKernel<CUDA_MAX_SPACE_DIMENSION><<<blocks,threadsPerBlock>>>(devicePatches, hostArgs->patchesSize);
cudaDeviceSynchronize();
//calc kernel
maxBlockSize = 64;
blocks = (hostArgs->neighborhoodsSize /maxBlockSize);
if(0 != hostArgs->neighborhoodsSize % maxBlockSize){
blocks++;
}
threadsPerBlock = maxBlockSize;
size_t maxHeapSize = hostArgs->patchesSize * (sizeof(LegendreSpace) + sizeof(LinearSpline)) + hostArgs->neighborhoodsSize * (sizeof(ReactionDiffusionCCLinearForm) + sizeof(ReactionDiffusionCCBiLinearForm));
std::cout << "maxHeapSize: " << maxHeapSize << std::endl;
cudaDeviceSetLimit(cudaLimitMallocHeapSize, maxHeapSize);
std::cout << "blocks: " << blocks << ", threadsPerBlock: " << threadsPerBlock << std::endl;
integrateKernel<CUDA_MAX_SPACE_DIMENSION><<<blocks,threadsPerBlock>>>(deviceNeighborhoods, hostArgs->neighborhoodsSize, devicePatches, hostArgs->patchesSize, hostArgs->biLinearForms, hostArgs->linearForms, deviceRes);
cudaDeviceSynchronize();
}
메모리 전송 및 할당은 문제가되지 않습니다.
EDIT 2 : 래퍼 기능을 통해 디버그 모드로 빌드 할 때 각 커널 호출 후에 오류를 확인합니다. 트릭을 붙여하지 않는
이cudaError_t cuda_result_code = cudaGetLastError();
if (cuda_result_code!=cudaSuccess) {
fprintf("message: %s\n",cudaGetErrorString(cuda_result_code));
}
죄송이 언급하지 않는, 래퍼 날에 의해 미안되지 않습니다 : 각각의 커널이 실행 된 다음 호출 한 후 그래서. 오른쪽 실패 전에 출력은 다음과 같다 :
blocks: 1, threadsPerBlock: 64
maxHeapSize: 4480
blocks: 1, threadsPerBlock: 64
message: invalid argument
코드 제공이 도움이 될 것입니다. 특히 두 번째 커널 호출의 시작 매개 변수와 그 파생 방법에 관심이 있습니다. –
적어도 메모리 초기화 및 커널 호출 코드를 알려주십시오 .. – ardiyu07
오류 검사가 표시되지 않습니다. "잘못된 인수 오류"로 커널이 실패하는 것을 어떻게 알 수 있습니까? 또한 두 커널을 시작하기 직전에 blocks 및 threadsPerBlock 변수를 출력합니다. 실패 이전에 어떤 결과물을 얻었습니까? –