2011-11-23 8 views
5

Si tratta di un follow-up a Using #include to load OpenCL codeincorporazione del codice OpenCL in eseguibile

Ho notato che quando si utilizza il metodo descritto da grrussel (e utilizzato a Bullet Physics), la stringa creata ha tutti i ritorni a capo spogliato (commenti sembrano essere spogliato anche io, ma non sono troppo preoccupato per questo). Ora per la maggior parte questo va bene se il codice opencl incluso non contiene definizioni di preprocessore, ma se c'è il codice non riuscirà a compilare con il compilatore OpenCL.

C'è un modo per ottenere il #include per mantenere i newline in là, o c'è un metodo migliore per incorporare il codice opencl nel mio eseguibile (oltre a copiare la stringa in un file cpp e mettere virgolette su tutto ciò)?

Ho provato questo in Visual Studio 2010, non sono sicuro se altri compilatori mostrano lo stesso comportamento. Preferirei un metodo che non richiede strumenti esterni e funziona con una varietà di compilatori/piattaforme.

codice Copiato da altra risposta:

In C fonte ++/C

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

Nella fonte OpenCL

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

risposta

1

Scriverei un piccolo strumento che genera un cpp con una stringa costante dal file di testo, che verrà poi compilato insieme alle altre cose.

Questo è ciò che fa il compilatore di risorse di Qt (e anche di più, dato che ha un'intera API attorno ad esso), e c'è anche l'opzione del kit di risorse di Windows (vedi this answer di seguito).

In ogni caso, un piccolo strumento di compilazione che passi i file in una directory e ne costruisca un file da loro dovrebbe essere sufficiente e qualcosa che è possibile riunire in 15 minuti (con competenze di scripting adeguate).

Aggiornamento: Come per il commento di Henry, su Linux (o con Msys/Cygwin), è possibile utilizzare xxd con il -i (cioè xxd -i) bandiera, che legge un file e genera un c-includono file con il contenuti esatti definiti correttamente.

+1

['xxd -i'] (http://linux.die.net/man/1/xxd) fa questo per te. –

+0

@HenryGomersall: 'xxd' non è facilmente disponibile su Windows o? – Macke

+1

Non so;) Penso che sia disponibile tramite msys o cygwin. Ho postato il commento perché mi ci è voluto un po 'per trovare la soluzione xxd che ha trovato prima la tua risposta, quindi sicuramente con Linux è una buona soluzione. –

1

Ottima domanda!

Una cosa che funziona su Windows è trattare i file OpenCL C come risorse di Windows. Quindi il codice sorgente viene incorporato nel tuo eseguibile. Nel file reasource (RC), si dovrebbe aggiungere qualcosa di simile:

IDR_OPENCL_FILE_1   OPENCL_SOURCE   "mydir\\myfile.cl" 

Poi, nel host di origine, qualcosa di simile:

// 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); 

Su Linux, objcopy ti consente di fare qualcosa simile. Puoi costruire un elfo .o con il file sorgente esportato come simbolo. Spiacente, non ho uno snippet di codice a portata di mano per ora.

Vorrei che ci fosse una risposta migliore indipendente dalla piattaforma. Se lo trovi, fammi sapere.

+0

Una soluzione indipendente dalla piattaforma sarebbe Qt's moc o xxd tramite cygwin/msys o qualcosa di simile. – Macke

Problemi correlati