我刚刚从旧版本( 32位 2013.2.0.0)将我的Haskell平台升级到最新版本( 64位 2014.2.0.0)。我重新安装了我的项目需要通过cabal并构建主要的各种软件包。但是,这次OpenCL (1.0.3.4)软件包在第一次外部调用中崩溃(clGetPlatformIDs
)。
崩溃是一种访问冲突。
我无法通过任何Windows调试工具获得堆栈跟踪。
我在clGetPlatformIDs
中的Visual Studio中设置了一个断点,它从不会命中,所以崩溃就在那之前。我没有OpenCL.dll
的符号,但我认为它应该能够找到界面符号;它解决了断点。
KHR OpenCL.dll
确实已加载。
没有一个寄存器包含一个可用的地址,该地址落在我能看到的模块中。
我可以进一步了解ghci
。这些调用有效,但我的OpenCL实现并没有显示出来。
32位平台工作正常。
这种气味就像一个链接问题。 (我没有干净地离开Haskell运行时。)我该如何修复或调试它?人们通常如何调试这样的绑定问题?
注1:重新安装各种包装后,我会看到警告:
Util.hs:291:1: Warning:
the 'stdcall' calling convention is unsupported on this platform,
treating as ccall
When checking declaration:
foreign import stdcall unsafe "static windows.h GetCurrentProcessId" getCurrentProcessId
:: IO WIN32.DWORD
我忽略了这些,因为它们对于正常运行的包大量出现。最小的测试表明它们仍然有效,而且我无法在网上找到有关此警告的重要信息。 Win32 API在Haskell中被大量使用,我不相信它在64位Haskell平台上完全被破坏了。而且,上述getCurrentProcessId
工作正常。我假设ghc
为x64选择正确的约定并忽略stdcall(我认为它不存在于Windows上)。
注2:我使用以下命令安装了OpenCL模块:
% cabal install OpenCL \
--extra-include-dirs="C:\Program Files (x86)\Intel\OpenCL SDK\4.0\include" \
--extra-lib-dirs="C:\Program Files (x86)\Intel\OpenCL SDK\4.0\lib\x64"
(为了便于阅读,此处插入了\ newlines;这是一行。)