C ++ / CLI с OpenCL в Visual Studio 10 - PullRequest
       24

C ++ / CLI с OpenCL в Visual Studio 10

3 голосов
/ 14 марта 2012

Прежде всего, я хотел бы начать с того, что я относительно новичок в openCL и немного устарел в C ++. Кроме того, это первый раз, когда я задаю вопрос, поэтому не стесняйтесь поправлять меня или указывать на то, что я мог бы улучшить в посте.

Я заинтересован в создании проекта, который будет создавать сборку dll в смешанном режиме (проект библиотеки CLR) для загрузки и использования приложениями формы CLR. DLL импортирует файлы заголовков c ++ статической библиотеки openCL (собственный код) и использует управляемый класс-обертку, чтобы использовать его для представления в 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 *),  

Я использую amd APP SDK v2.6 со спецификациями openCL 1.2, Visual Studio 2010 Ultimate и связываю заголовок / lib, предоставляемый SDK. Теоретически переход от неуправляемого к неуправляемому коду не должен вызывать проблем, так как он скомпилирован с / 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 и сбоем компилятора (CL.exe из-за c1xx.dll) и независимо от того, как я играю с переключателями, я в растерянности.

Переключатели: / CLR, / MDd, оптимизация отключена, EHa для обработки исключений. И удаление #defines или любого кода переноса ничего не меняет и не удаляет # pragmas.

Я должен отметить, что проект прекрасно компилируется с включенным в него C API (CL \ cl.h), и я знаю, что мог бы использовать это вместо этого.

Кто-нибудь еще сталкивался с этой проблемой? Или я что-то делаю ужасно неправильно? Буду очень признателен за информацию по этому вопросу.

1 Ответ

2 голосов
/ 14 марта 2012

Внутренняя ошибка компилятора означает, что у вашего компилятора произошел сбой .Он не нашел ошибку в вашем коде;сам компилятор сломался .Это происходит из-за ошибки в компиляторе, но если ваш код неверен, то это могло бы помочь вызвать ошибку.

Поскольку «ваш код» в этом случае на самом деле не ваш код, но код OpenCL, возможно, он не может быть скомпилирован компилятором C ++ / CLI.

...