2016-07-23 33 views
0

我一直在努力學習的OpenCL但每次我把這個命令我的代碼休息時間, 下面是一個簡單的代碼,我已經分離的錯誤: clGetPlatformIDs職高休耕錯誤:OPENCL不能使用clGetPlatformIDs

OpenCl-OpenGl.exe中0x778d15ee處未處理的異常:0xC0000005:訪問衝突。

然後程序給出的選項「破發」或「繼續」

#pragma comment(lib, "OpenCL.lib") 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <CL/cl.h> 

int main() { 
    cl_platform_id platform; 
    cl_int err; 
    err = clGetPlatformIDs(1, &platform, NULL); 

    return 0; 

} 
+0

它被確認爲能夠OpenCL的其他任何系統上運行? –

回答

1

這可能有以下幾個原因:

  1. 您有多個OpenCL.dll您的系統上,並通過選擇(或一些VS設置,環境路徑)可執行文件正在加載舊版本。檢查VS模塊窗口(調試>窗口>模塊)是否加載了正確的OpenCL.dll(C:\ Windows \ SysWow64或C:\ Windows \ System32)。

  2. 儘管clGe​​tPatformIDs中的第三個參數是可選的,但我知道一些較舊的Intel OpenCL供應商庫(intelopencl32.dll或intelopencl64.dll)不檢查此問題,並可能嘗試寫入該nullptr。我建議嘗試添加接收平臺計數的第三個參數。

  3. 如果兩者似乎都不能解決問題,請在發生崩潰時/發佈來自Visual Studio的堆棧轉儲。此外,請檢查調試輸出窗口以查看它是讀取訪問還是寫入訪問衝突。所有窗口都可以在菜單Debug> Windows> Output下找到。你也可以在那裏找到堆棧和模塊。


編輯:我只是做了一個試驗用最新版本OpenCL.dll,只提供了一個陣列1項,像你這樣。不過,OpenCL.dll寫入了3個元素,意味着它在允許的數組邊界之外寫入。巧合的是,我有3個平臺。

當您提供cl_platform_id類型的單個變量時,此行爲會損壞堆棧,並且在此簡短程序中很可能會損壞clGetPlatformIds的返回地址,從而導致您的崩潰。我必須進一步調查。嘗試同時使用cl_platform_id平臺[8]數組。它看起來像我OpenCl.dll一個bug,2.01版

試試這個代碼:

cl_uint PlatformCount = 0; 
cl_platform_id Platforms[8] = { 0 }; 

cl_int Status = clGetPlatformIDs(sizeof(Platforms)/sizeof(Platforms[0]), Platforms, &PlatformCount); 
if (Status != CL_SUCCESS || PlatformCount == 0) 
    error(...) 
+0

我不知道發生了什麼,但我做了一個新的projetc,它工作得很好,感謝上帝,項目剛剛開始 –