我買了內核啓動的問題。我有一個使用一個大內核的程序。由於同步問題,現在我需要將它分成兩部分。第一個內核做一些初始化的東西,並傳遞給第二個內核的參數的一個子集。只運行第一個內核工作正常。由於缺少初始化,但只執行第二個內核在執行時失敗,但內核本身已啓動。連續運行會導致第二個內核失敗並出現「無效參數」錯誤。我會在必要時提供代碼,但現在無法弄清楚它可能會有什麼幫助。提前致謝。CUDA「無效的參數」的錯誤在第二核心
編輯: 這裏所要求的啓動代碼:
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();
}
的內存傳輸和分配不應該只用一個內核的時候是一個問題,因爲它的工作。
編輯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
我敢肯定,你提供的代碼會有所幫助。特別是我會對第二個內核調用的啓動參數感興趣,以及它們是如何派生的。 –
至少向我們展示你的記憶init和內核調用代碼.. – ardiyu07
我沒有看到任何錯誤檢查。你怎麼知道你得到一個內核失敗,「無效的參數錯誤」?此外,在內核啓動之前,您正在輸出塊和threadsPerBlock變量。你在失敗之前得到了什麼輸出? –