首先,我想首先说一下我对openCL还是比较陌生,并且在C++中有点生疏。这也是我第一次问一个问题,所以请随时纠正我或指出我在帖子中可以改进的地方。

我对创建一个项目感兴趣,该项目将创建混合模式的程序集dll(CLR库项目)以供CLR Form应用程序加载和使用。 DLL正在导入openCL静态库c++头文件(本机代码),并使用托管包装器类将其公开给CLR。

但是,我一直陷入致命错误C1001的陷阱,而实际上它并没有太多经历。

1>C:\Program Files (x86)\AMD APP\include\cl\cl.hpp(1270): warning C4290: C++ exception      specification ignored except to indicate a function is not __declspec(nothrow)
1>C:\Program Files (x86)\AMD APP\include\cl\cl.hpp(3708): fatal error C1001: An internal error has occurred in the compiler.
1>(compiler file 'msc1.cpp', line 1420)
1>To work around this problem, try simplifying or changing the program near the locations listed above.
1>Please choose the Technical Support command on the Visual C++

指向哪
cl_int enqueueNativeKernel(
void (CL_CALLBACK *userFptr)(void *),

我正在使用带有openCL 1.2规范,Visual Studio 2010 Ultimate的amd APP SDK v2.6,并链接了SDK提供的 header /库。从理论上讲,从非托管代码到非托管代码的跨越不应该成为问题,因为它是使用/ CLR编译的,所以我加入了#pragmas来表示无论如何都将进行非托管传递
#pragma once
#pragma managed(push,off)
#define __NO_STD_STRING
#define __NO_STD_VECTOR
#include <cl\cl.hpp>

#pragma comment(lib,"OpenCL.lib")
#pragma managed(pop)

//rest of code

总是遇到可怕的C1001错误和编译器崩溃(由于c1xx.dll而导致CL.exe),无论我如何使用开关,我都一头雾水。

开关如下:/ CLR,/ MDd,禁用优化,EHa用于异常处理。删除#defines或任何包装代码都不会改变任何事情,也不会删除#pragmas。

我应该注意,该项目可以使用包含的C API(CL \ cl.h)很好地进行编译,我知道我可以使用它。

还有其他人遇到过这个问题吗?还是我做错了什么?我真的很感谢有关此事的一些信息。

最佳答案

内部编译器错误表示您的编译器已崩溃。它在您的代码中未发现错误;编译器本身坏了。这是由于编译器中的错误所致,但是如果您的代码错误,则可能有助于触发该错误。

由于在这种情况下,“您的代码”实际上不是您的代码,而是OpenCL的代码,因此可能只是C++ / CLI编译器无法对其进行编译。

07-24 09:43
查看更多