我是OpenCL的新手。在运行Windows 7的具有Intel(R)HD Graphics 4000的Core i5计算机上工作,我安装了支持OpenCL的最新Intel驱动程序。GpuCapsViewer确认我具有OpenCL支持设置。我使用英特尔OpenCL SDK开发了一个简单的HelloWorld程序。我已经成功编译了程序,但是运行时,由于分段错误而调用clGetPlatformIDs()时,它崩溃了。这是我的代码:
#include#include int main() { std::cout << "Test OCL without driver" << std::endl; cl_int err; cl_uint num_platforms; err = clGetPlatformIDs(0, NULL, &num_platforms); if (err == CL_SUCCESS) { std::cout << "Success. Platforms available: " << num_platforms << std::endl; } else { std::cout << "Error. Platforms available: " << num_platforms << std::endl; } std::cout << "Test OCL without driver" << std::endl; std::cout << "Press button to exit." << std::endl; std::cin.get(); return 0; }
GpuCapsViewer如何成功确认OpenCL支持并可以使用它运行其演示,但我却无法运行我的代码?两者必须使用相同的功能,对吗?
已经为此工作了几天。甚至尝试重新安装驱动程序。有任何想法吗?
GpuCapsViewer说:
驱动程序:R295.93(r295_00-233)/ 10.18.10.3496(3-11-2014)
OPENGL:OpenGL 4.2(GeForce GT 630M / PCIe / SSE2具有290 ext。)
OPENCL:OpenCL 1.1,GeForce GT 630M计算单位:2 @ 950MHz
CUDA:GeForce GT 630M CC:2.1,多处理器:2 @ 950MHz
PHYSX:GPU PhysX(NVIDIA GeForce GT 630M)
MULTI-GPU:不支持多GPU(2个物理GPU)
更新:
编译行:
g++ -I"C:\Program Files (x86)\Intel\OpenCL SDK\4.4\include" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"Test3.d" -MT"Test3.d" -o "Test3.o" "../Test3.cpp" Finished building: ../Test3.cpp
链接器行:
g++ -L"C:\Program Files (x86)\Intel\OpenCL SDK\4.4\lib\x64" -o "TestOpenCL" ./HelloWorld.o ./HelloWorld2.o ./Test3.o -lOpenCL Finished building target: TestOpenCL
操作系统:Windows 7 Ultimate Version 6.1(内部版本7601:Service Pack 1)
更新2,崩溃信息:
Problem Event Name: APPCRASH Application Name: TestOpenCL.exe Application Version: 0.0.0.0 Application Timestamp: 53bc6ac5 Fault Module Name: TestOpenCL.exe Fault Module Version: 0.0.0.0 Fault Module Timestamp: 53bc6ac5 Exception Code: c0000005 Exception Offset: 0000000000002cc0 OS Version: 6.1.7601.2.1.0.256.1 Locale ID: 1033 Additional Information 1: 56e3 Additional Information 2: 56e3743a8a234df3bdeba0b507471c44 Additional Information 3: 8fe0 Additional Information 4: 8fe0ef5706153941955de850e5612393
更新3:
使用DependencyWalker(http://dependencywalker.com/)来替代dumpbin。它生成以下警告:
Warning: At least one delay-load dependency module was not found. Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.
警告似乎是指以下所有DLL,这些DLL都标有“错误打开文件。系统找不到指定的文件(2)”错误消息。
API-MS-WIN-CORE-COM-L1-1-0.DLL API-MS-WIN-CORE-WINRT-ERROR-L1-1-0.DLL API-MS-WIN-CORE-WINRT-L1-1-0.DLL API-MS-WIN-CORE-WINRT-ROBUFFER-L1-1-0.DLL API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL API-MS-WIN-SHCORE-SCALING-L1-1-0.DLL DCOMP.DLL IESHIMS.DLL
更新4,GDB BACKTRACE:
Program received signal SIGSEGV, Segmentation fault. 0x0000000000402cc0 in clGetPlatformIDs () (gdb) backtrace full #0 0x0000000000402cc0 in clGetPlatformIDs () No symbol table info available. #1 0x0000000000402af3 in main () at ../Test3.cpp:11 err = 0 num_platforms = 0 platform = 0x0 (gdb) backtrace #0 0x0000000000402cc0 in clGetPlatformIDs () #1 0x0000000000402af3 in main () at ../Test3.cpp:11
更新5,GDB无效:
(gdb) disass Dump of assembler code for function clGetPlatformIDs: => 0x0000000000402cc0 <+0>: jmpq *0x4b74e8(%rip) # 0x8ba1ae 0x0000000000402cc6 <+6>: nop 0x0000000000402cc7 <+7>: nop End of assembler dump.
更新6,GDB信息已共享:
(gdb) INFO SHARED From To Syms Read Shared Object Library 0x0000000077191000 0x00000000773384e0 Yes (*) C:\Windows\system32\ntdll.dll 0x0000000077071000 0x000000007718eab4 Yes (*) C:\Windows\system32\kernel32.dll 0x000007fefc081000 0x000007fefc0eb13c Yes (*) C:\Windows\system32\KernelBase.dll 0x000007fedf8d1000 0x000007fedf8e96aa Yes (*) C:\Windows\system32\OpenCL.dll 0x000007fefe101000 0x000007fefe1da628 Yes (*) C:\Windows\system32\advapi32.dll 0x000007fefe061000 0x000007fefe0fe4bc Yes (*) C:\Windows\system32\msvcrt.dll 0x000007fefdcc1000 0x000007fefdcde39a Yes (*) C:\Windows\SYSTEM32\sechost.dll 0x000007fefc6a1000 0x000007fefc7cc914 Yes (*) C:\Windows\system32\rpcrt4.dll (*): Shared library is missing debugging information.
二进制文件,x64,包括文件夹:
https://drive.google.com/file/d/0BxKA63T2GnKMRW02QWZnam5lSGM/edit?usp=sharing
更新7,GPUcaps情况:
GPUcaps可检测2个GPU:
GPU 1:Intel(R)高清显卡4000
GPU 2:NVIDIA GeForce GT 630M
您可以在此处查看屏幕截图:
https://drive.google.com/file/d/0BxKA63T2GnKMa00tU1gydGNJeXc/edit?usp=sharing
更新8:
根据@antiduh的回答,我一直在尝试直接针对Windows \ System32文件夹中存在的OpenCL.dll进行链接。我正在使用mingw64。我得到这个:
Invoking: Cross G++ Linker g++ -L"C:\Windows\System32" -o "TestOpenCL" ./HelloWorld.o ./HelloWorld2.o ./Test3.o -lOpenCL d:/ws/apps_inst/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.7.1/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:\Windows\System32/OpenCL.dll when searching for -lOpenCL d:/ws/apps_inst/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.7.1/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:\Windows\System32/OpenCL.dll when searching for -lOpenCL d:/ws/apps_inst/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.7.1/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lOpenCL d:/ws/apps_inst/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.7.1/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:\Windows\System32/msvcrt.dll when searching for -lmsvcrt d:/ws/apps_inst/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.7.1/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:\Windows\System32/advapi32.dll when searching for -ladvapi32 d:/ws/apps_inst/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.7.1/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:\Windows\System32/shell32.dll when searching for -lshell32 d:/ws/apps_inst/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.7.1/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:\Windows\System32/user32.dll when searching for -luser32 d:/ws/apps_inst/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.7.1/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:\Windows\System32/kernel32.dll when searching for -lkernel32 d:/ws/apps_inst/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.7.1/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible C:\Windows\System32/msvcrt.dll when searching for -lmsvcrt
更新9:现在,我可以使用以下代码行手动编译,链接和运行示例代码。
g++ -I. s.cpp -L. -lOpenCL
我简化了一切,并且一切正常。这显然与Eclipse使用的compile和link命令有很大不同。知道eclipse使用哪个参数会引起问题吗?而且,为什么eclipse首先在两个单独的步骤中编译为目标文件,然后尝试链接它们?