встраивание кода OpenCL в исполняемый файл - PullRequest
5 голосов
/ 24 ноября 2011

Это продолжение Использование #include для загрузки кода OpenCL

Я заметил, что при использовании метода, описанного grrussel (и используемого в Bullet Physics), создаетсяВ строке удалены все символы новой строки (комментарии, кажется, тоже удалены, но я не слишком беспокоюсь об этом).Теперь по большей части это нормально, если во включенном коде opencl нет каких-либо определений препроцессора, но если он есть, он не сможет скомпилироваться с помощью компилятора OpenCL.

Есть ли способ получить#include для сохранения там новых строк, или есть лучший способ встроить код opencl в мой исполняемый файл (кроме копирования строки в файл cpp и расстановки кавычек вокруг всего)?

Я тестировалэто в Visual Studio 2010, я не уверен, что другие компиляторы демонстрируют такое же поведение.Я бы предпочел метод, который не требует каких-либо внешних инструментов и работает с различными компиляторами / платформами.

Скопированный код из другого ответа:

В источнике C ++ / C

#define MSTRINGIFY(A) #A
char* stringifiedSourceCL = 
#include "VectorAddKernels.cl"

В исходном коде OpenCL

MSTRINGIFY(
   __kernel void VectorAdd(__global float8* c)
   {
    // snipped out OpenCL code...
    return;
   }
);

Ответы [ 2 ]

1 голос
/ 30 ноября 2011

Я бы написал небольшой инструмент, который генерирует cpp с константной строкой из текстового файла, который вы затем скомпилируете вместе с другими вещами.

Это то, что делает moc компилятора ресурсов Qt (и более того, поскольку он имеет целый API), а также есть опция комплекта ресурсов Windows (см. этот ответ ниже).

В любом случае, достаточно небольшого инструмента для сборки, который просматривает файлы в директории и создает из них cpp, и что-то, что вы можете собрать за 15 минут (при наличии соответствующих навыков написания сценариев).

Обновление : Согласно комментарию Генри, в Linux (или с Msys / Cygwin) вы можете использовать xxd с флагом -i (т.е. xxd -i), который читает файл и создает файл c-include с точным содержимым, определенным правильно.

1 голос
/ 30 ноября 2011

Отличный вопрос!

Одна вещь, которая работает в Windows - это обрабатывать ваши файлы OpenCL C как ресурсы Windows.Затем исходный код будет встроен в ваш исполняемый файл.В вашем файле ресурсов (.rc) вы бы добавили что-то вроде этого:

IDR_OPENCL_FILE_1            OPENCL_SOURCE           "mydir\\myfile.cl"

Затем в исходном файле хоста что-то вроде этого:

// Load the resource memory
HRSRC resource = FindResource(NULL, L"IDR_OPENCL_FILE_1", L"OPENCL_SOURCE");
HGLOBAL resMem = LoadResource(NULL, resource);
char* source = (char*)LockResource(resMem);
// Build a STL string out of it
DWORD resSize = SizeofResource(NULL, resource);
std::string cl_source = string(source, resSize);

В Linux objcopyпозвольте вам сделать что-то подобное.Вы можете создать elf .o с исходным файлом, экспортированным как символ.Извините, у меня нет подходящего фрагмента кода для этого прямо сейчас.

Хотелось бы, чтобы был лучший независимый от платформы ответ.Если вы столкнетесь с этим, дайте мне знать.

...