2012-12-21 57 views
0

我買了內核啓動的問題。我有一個使用一個大內核的程序。由於同步問題,現在我需要將它分成兩部分。第一個內核做一些初始化的東西,並傳遞給第二個內核的參數的一個子集。只運行第一個內核工作正常。由於缺少初始化,但只執行第二個內核在執行時失敗,但內核本身已啓動。連續運行會導致第二個內核失敗並出現「無效參數」錯誤。我會在必要時提供代碼,但現在無法弄清楚它可能會有什麼幫助。提前致謝。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 
+1

我敢肯定,你提供的代碼會有所幫助。特別是我會對第二個內核調用的啓動參數感興趣,以及它們是如何派生的。 –

+1

至少向我們展示你的記憶init和內核調用代碼.. – ardiyu07

+1

我沒有看到任何錯誤檢查。你怎麼知道你得到一個內核失敗,「無效的參數錯誤」?此外,在內核啓動之前,您正在輸出塊和threadsPerBlock變量。你在失敗之前得到了什麼輸出? –

回答

2

cudaDeviceSetLimit

cudaLimitMallocHeapSize控件的大小在由malloc()和遊離()裝置系統調用中使用的堆的字節。設置cudaLimitMallocHeapSize必須啓動一個使用的malloc()或free()的設備系統調用任何內核之前進行,否則cudaErrorInvalidValue將被退回。此限制僅適用於計算能力2.0和更高的設備。試圖在計算能力低於2.0的設備上設置此限制將導致返回錯誤cudaErrorUnsupportedLimit。

+0

非常感謝這個答案。當我有一些可能持續幾天的時間時,我會嘗試一下你的建議,對此抱歉。 – soriak

+0

現在我有時間檢查我的代碼並記住您的答案。我的內存分配設計中有不同的錯誤。我現在首先調用cudaDeviceSetLimit(獲得一張具有計算能力2.0的卡),而不是內核來初始化一些內存。與主內核(integrateKernel)相比,它自己分配和釋放一些內存。最後一個新的內核釋放由init內核初始化的內存(我忘了這麼做)。現在一切正常。再次感謝你的回答,你真的讓我脫身。 – soriak