2014-12-23 2 views
2

저는 꽤 오랫동안 OpenCl 라이브러리를 사용하고 있었지만 괜찮 았습니다. 내가 시험을 programm을 실행할 때 결국 나는 그런 오류를 윈도우 7 x64 시스템과는 MinGW와 86 AMD의 응용 프로그램 SDK 버전 2.9을 사용하여OpenCL의 이상한 Segfault

Program received signal SIGSEGV, Segmentation fault. 
[Switching to Thread 29020.0x38e0] 
0x0186e9da in ??() 
(gdb) backtrace 
#0 0x0186e9da in ??() 
#1 0x7718b46b in ntdll!LdrRemoveLoadAsDataTable() from C:\Windows\SysWOW64\ntdll.dll 
#2 0x0186eb00 in ??() 
#3 0x77140133 in ntdll!KiUserExceptionDispatcher() from C:\Windows\SysWOW64\ntdll.dll 
#4 0x0086eb00 in ??() 
#5 0x0186ef60 in ??() 

I'am가 발생했습니다. 그래서 저는 libOpenCL.a와 연결하고 있습니다. 내가 시스템의 장치 수를 얻으려고 할 때마다 :

result = clGetPlatformIDs(0, NULL, &platforms); 

나는 그 segfault를 얻는다. 또한! 때로는 SIGI L 폴트, Segmentation fault, illegal instruction이 표시됩니다. 어떻게이 이상한 erorrs를 해결할 수 있습니까? 또한 clGetPlatformIds 내가 그 코드 라인을 호출하는 브레이크 포인트에서을 gdb에 입력하면 나는 위 단계를 밟을 수 없으며 즉시 하나 또는 다른 segfault를 얻습니다. OpenCL에 이미 segfault에 대한 주제가 있지만이 사이트에 이미 있습니다. 내가 다시 검사, 내가 응용 프로그램 SDK 라이브러리에 대한 amd를 연결 해요, 난 단순히 디렉토리에서 그것을 제거하고 gcc는 나를 인쇄 gcc.exe: error: C:/MinGW/lib/libOpenCL.a: No such file or directory 그래서, 내가 뭘 잘못 됐는지 모르겠다.

UPDATE

나는 2

내가 AMD SDK와 함께 제공 VC++에 대한 OpenCL.lib을 사용하려고 다음과 같은 출력이 clGetPlatformIds

warning: 
STATUS_STACK_BUFFER_OVERRUN encountered 


Program received signal SIGTRAP, Trace/breakpoint trap. 
0x768c025e in KERNEL32!GetProfileStringW() from C:\Windows\syswow64\kernel32.dll 
(gdb) backtrace 
#0 0x768c025e in KERNEL32!GetProfileStringW() from C:\Windows\syswow64\kernel32.dll 
#1 0x779117b4 in RPCRT4!I_RpcInitHttpImports() from C:\Windows\syswow64\rpcrt4.dll 
#2 0x77895dce in RpcExceptionFilter() from C:\Windows\syswow64\rpcrt4.dll 
#3 0x77e9b499 in ntdll!LdrRemoveLoadAsDataTable() from C:\Windows\SysWOW64\ntdll.dll 
#4 0x0194dd08 in ??() 
#5 0x77e9b46b in ntdll!LdrRemoveLoadAsDataTable() from C:\Windows\SysWOW64\ntdll.dll 
#6 0x0194dd08 in ??() 
#7 0x77e50133 in ntdll!KiUserExceptionDispatcher() from C:\Windows\SysWOW64\ntdll.dll 
#8 0x0094dd08 in ??() 
#9 0x0194dd58 in ??() 
#10 0x767e3f5f in msvcrt!_except_handler4_common() from C:\Windows\syswow64\msvcrt.dll 
#11 0x767e3ed7 in msvcrt!_except_handler4_common() from C:\Windows\syswow64\msvcrt.dll 
#12 0x7612bbf8 in CM_Locate_DevNodeA() from C:\Windows\syswow64\cfgmgr32.dll 
#13 0x77e9b499 in ntdll!LdrRemoveLoadAsDataTable() from C:\Windows\SysWOW64\ntdll.dll 
#14 0x0194e524 in ??() 
#15 0x77e9b46b in ntdll!LdrRemoveLoadAsDataTable() from C:\Windows\SysWOW64\ntdll.dll 
#16 0x0194e524 in ??() 
#17 0x77e50133 in ntdll!KiUserExceptionDispatcher() from C:\Windows\SysWOW64\ntdll.dll 
#18 0x0094e524 in ??() 
#19 0x0194e574 in ??() 
#20 0x767e3f5f in msvcrt!_except_handler4_common() from C:\Windows\syswow64\msvcrt.dll 
#21 0x767e3ed7 in msvcrt!_except_handler4_common() from C:\Windows\syswow64\msvcrt.dll 
#22 0x7612bbf8 in CM_Locate_DevNodeA() from C:\Windows\syswow64\cfgmgr32.dll 
#23 0x77e9b499 in ntdll!LdrRemoveLoadAsDataTable() from C:\Windows\SysWOW64\ntdll.dll 
#24 0x0194ed40 in ??() 
#25 0x77e9b46b in ntdll!LdrRemoveLoadAsDataTable() from C:\Windows\SysWOW64\ntdll.dll 
#26 0x0194ed40 in ??() 
#27 0x77e50133 in ntdll!KiUserExceptionDispatcher() from C:\Windows\SysWOW64\ntdll.dll 
#28 0x0094ed40 in ??() 
#29 0x0194ed90 in ??() 
#30 0x00000000 in ??() 

UPDATE에 스테핑 생산 관리 , 그리고 그것은 잘 작동했습니다. 나는 Visual Studio에서 clGetPlatformIDs을 호출하는 테스트 애플리케이션을 만들었고 MinGW와 반대되는 작업을했다. 나는 VC 버전과 MinGW 버전에서로드 된 모듈을 찾았다. 차이는는 MinGW는

0x6cbd1000 0x6cbe2d02 Yes (*) C:\Windows\system32\OpenCL.dll 

을로드하고 비주얼 스튜디오에서 OpenCL을가에서로드 :

C:\Windows\SysWOW64\OpenCL.dll 

MSVC의 응용 프로그램에서 Win32 아키텍처 구축입니다. VC 버전도 그렇지만 OpenCL.lib은 AMD APP SDK의 MinGW 버전 libOpenCL.a과 다르게 작동하는 것 같습니다. 2.9.1 SDK로 변경하려고했지만 결과는 동일합니다!

UPDATE 나는 GDB와 어셈블러 코드로 스테핑 약간의 연구를 수행 3

. clGetPlatformIDs 호출 몇 가지 지침, C:\Windows\System32\opencl.dll에 다음 모듈 변경을 실행을 programm의 successuffly 후 :

=> 0x401a50 <[email protected]+57>: movl $0x0,(%esp) 
(gdb) 
0x00401a57  189    cl_int tN = clGetPlatformIDs(0,NULL,&numPlatforms); 
1: x/i $pc 
=> 0x401a57 <[email protected]+64>: call 0x402410 <[email protected]> 
(gdb) stepi 
0x00402410 in [email protected]() 
1: x/i $pc 
=> 0x402410 <[email protected]>:  jmp *0x409270 
(gdb) nexti 
0x6cbd3480 in clGetPlatformIDs() from C:\Windows\system32\OpenCL.dll 
1: x/i $pc 
=> 0x6cbd3480 <clGetPlatformIDs>:  push %ebp 
(gdb) 

그래서 나는 어떤 연결 문제가 바로이없는 것 같은데요? 내 말은, 코드가 실행되고있다. OpenCL.dll 모든 것이 잘되어야한다. 다음은 (내가 nexti 명령을 사용하고 있습니다), 일 :

0x6cbd3485 in clGetPlatformIDs() from C:\Windows\system32\OpenCL.dll 
1: x/i $pc 
=> 0x6cbd3485 <clGetPlatformIDs+5>:  call 0x6cbd1030 
(gdb) 
0x6cbd1030 in ??() from C:\Windows\system32\OpenCL.dll 
1: x/i $pc 
=> 0x6cbd1030: cmpl $0x0,0x6cbdeda0 
(gdb) nexti 
0x6cbd1037 in ??() from C:\Windows\system32\OpenCL.dll 
1: x/i $pc 
=> 0x6cbd1037: jne 0x6cbd1043 
(gdb) nexti 
0x6cbd1039 in ??() from C:\Windows\system32\OpenCL.dll 
1: x/i $pc 
=> 0x6cbd1039: call 0x6cbd3a50 <clWaitForEvents+128> 
(gdb) nexti 
0x6cbd3a50 in clWaitForEvents() from C:\Windows\system32\OpenCL.dll 
1: x/i $pc 
=> 0x6cbd3a50 <clWaitForEvents+128>: push $0x0 
(gdb) 
0x6cbd3a52 in clWaitForEvents() from C:\Windows\system32\OpenCL.dll 
1: x/i $pc 
=> 0x6cbd3a52 <clWaitForEvents+130>: push $0x0 
(gdb) 
0x6cbd3a54 in clWaitForEvents() from C:\Windows\system32\OpenCL.dll 
1: x/i $pc 
=> 0x6cbd3a54 <clWaitForEvents+132>: push $0x6cbd3a70 
(gdb) 
0x6cbd3a59 in clWaitForEvents() from C:\Windows\system32\OpenCL.dll 
1: x/i $pc 
=> 0x6cbd3a59 <clWaitForEvents+137>: push $0x6cbdeda8 
(gdb) 
0x6cbd3a5e in clWaitForEvents() from C:\Windows\system32\OpenCL.dll 
1: x/i $pc 
=> 0x6cbd3a5e <clWaitForEvents+142>: call *0x6cbda010 
(gdb) 
warning: 
STATUS_STACK_BUFFER_OVERRUN encountered 


Program received signal SIGTRAP, Trace/breakpoint trap. 
0x768c025e in KERNEL32!GetProfileStringW() from C:\Windows\syswow64\kernel32.dll 

그래서 clGetPlatformIDsclWaitForEvents가 충돌을 유도, *0x6cbda010에서 뭔가를 호출 clWaitForEvents를 호출 whichi 일부 PROC를 호출한다.내가 더 나아가 계속되면

0x6cbd3a5e in clWaitForEvents() from C:\Windows\system32\OpenCL.dll 
1: x/i $pc 
=> 0x6cbd3a5e <clWaitForEvents+142>: call *0x6cbda010 
(gdb) stepi 
0x7689d5f7 in KERNEL32!InitOnceExecuteOnce() from C:\Windows\syswow64\kernel32.dll 
1: x/i $pc 
=> 0x7689d5f7 <KERNEL32!InitOnceExecuteOnce>: mov %edi,%edi 

, 추적이

(gdb) backtrace 
#0 0x6cbd4725 in clWaitForEvents() from C:\Windows\system32\OpenCL.dll 
#1 0x77e7c057 in ntdll!LdrEnumerateLoadedModules() from C:\Windows\SysWOW64\ntdll.dl 
#2 0x6cbdeda8 in clWaitForEvents() from C:\Windows\system32\OpenCL.dll 
#3 0x7689d60e in KERNEL32!InitOnceExecuteOnce() from C:\Windows\syswow64\kernel32.dl 
#4 0x6cbd3a64 in clWaitForEvents() from C:\Windows\system32\OpenCL.dll 
#5 0x00401a5c in [email protected] (some=0x0) at cl.c:189 
다음과 같이 표시됩니다 *0x6cbda010에서이 '무언가'는 KERNEL32 기능 (여기에 내가 전화 내부보고 stepi하고 있어요)입니다

또 다른 추적,

#0 0x6cbd1050 in ??() from C:\Windows\system32\OpenCL.dll 
#1 0x77e7c057 in ntdll!LdrEnumerateLoadedModules() from C:\Windows\SysWOW64\ntdll.dll 
#2 0x6cbdeda8 in clWaitForEvents() from C:\Windows\system32\OpenCL.dll 
#3 0x7689d60e in KERNEL32!InitOnceExecuteOnce() from C:\Windows\syswow64\kernel32.dll 
#4 0x6cbd3a64 in clWaitForEvents() from C:\Windows\system32\OpenCL.dll 
#5 0x00401a5c in [email protected] (some=0x0) at cl.c:189 

실제 충돌 화장실 전에 스택 트레이스 (어떤 이유로 그 ?? 대신 clWairForEvents있다) 이렇게 좋아. 그래서 결국 clWaitForEvents이 충돌을 일으키는 이유는 무엇입니까? 문제가 clWaitForEvents 함수에 있다고 가정합니다.

+0

. libOpenCL.a가 표준 위치에 없으므로 링크 단계에는 두 개의 매개 변수가 추가되어야합니다 (gcc의 경우 매개 변수는 '-L/MinGW/lib'및 '-lOpenCL'입니다.) 경고 : – user3629249

+0

@ user3629249 난 그냥 OPENCL_LIB = OPENCL_LIB = '- lOpenCL' 내 makefile.am에 충분하지 않니? 나는 mingw가 C :/MinGW/lib 폴더의 라이브러리를 먼저 검색한다고 가정한다. – Vanya

+0

@ user3629249 어쨌든'LDFLAGS'에'-LC :/MinGW/lib'를 추가했는데 결과가 여전히 동일합니다 – Vanya

답변

0

컴파일하는 것과 비슷한 문제가있었습니다.
32 비트/64 비트 주소 문제로 밝혀졌습니다.

C : \ WINDOWS \ system32를 \ OpenCL.dll (32 비트)

C : \ WINDOWS \ SysWOW64와 \ OpenCL.dll (64 비트) 솔루션에 대한 지금

.

[아마 여기에서 확인 :] 당신은 프로그램 링크 단계에서 실패를 실행하려고 http://www.gnustep.org/windows/installer.html