2011-11-23 31 views
5

Đây là một followup để Using #include to load OpenCL codenhúng OpenCL mã vào thực thi

tôi đã nhận thấy rằng khi bạn sử dụng phương pháp mô tả bởi grrussel (và được sử dụng trong Bullet Physics), chuỗi tạo ra có tất cả các dòng mới lột (bình luận dường như cũng bị tước, nhưng tôi không quá lo lắng về điều đó). Bây giờ đối với hầu hết các phần này là tốt nếu mã opencl bao gồm không có bất kỳ định nghĩa tiền xử lý trong nó, nhưng nếu có mã sẽ không biên dịch với trình biên dịch OpenCL.

Có cách nào để có được các #include để giữ các dòng mới trong đó, hoặc là có một phương pháp tốt hơn để nhúng mã opencl vào thực thi của tôi (khác với sao chép chuỗi vào một tệp cpp và đặt dấu ngoặc kép xung quanh tất cả mọi thứ)?

Tôi đã thử nghiệm điều này trong Visual Studio 2010, tôi không chắc liệu các trình biên dịch khác có biểu hiện cùng một hành vi hay không. Tôi thích một phương thức không yêu cầu bất kỳ công cụ bên ngoài nào và hoạt động với nhiều trình biên dịch/nền tảng khác nhau.

mã được sao chép từ câu trả lời khác:

Trong C++/C nguồn

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

Trong nguồn OpenCL

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

Trả lời

1

Tôi muốn viết một công cụ nhỏ tạo ra một cpp với chuỗi không đổi từ tệp văn bản, sau đó bạn sẽ biên dịch cùng với các công cụ khác.

Đây là trình biên dịch tài nguyên của Qt (và nhiều hơn nữa, vì nó có toàn bộ API xung quanh nó) và cũng có tùy chọn bộ tài nguyên của Windows (xem this answer bên dưới).

Dù sao, một công cụ xây dựng nhỏ đi theo một tệp trong thư mục và xây dựng một tệp cpp từ chúng là đủ và bạn có thể đặt chúng trong 15 phút (với các kỹ năng viết phù hợp).

Cập nhật: Theo nhận xét của Henry, trên Linux (hoặc với MSYS/Cygwin), bạn có thể sử dụng xxd với -i (tức xxd -i) cờ, mà đọc một tập tin và tạo ra một c-bao gồm tập tin với nội dung chính xác được xác định chính xác.

+1

['xxd -i'] (http://linux.die.net/man/1/xxd) thực hiện điều này cho bạn. –

+0

@HenryGomersall: 'xxd' không có sẵn trên Windows, hoặc? – Macke

+1

Tôi không biết;) Tôi nghĩ rằng nó có sẵn thông qua msys hoặc Cygwin. Tôi đăng bình luận bởi vì nó đã cho tôi một chút thời gian để tìm giải pháp xxd đã đi qua câu trả lời của bạn đầu tiên, do đó, chắc chắn dưới linux đó là một giải pháp tốt. –

1

xuất sắc câu hỏi!

Một điều hoạt động trên Windows là xử lý các tệp OpenCL C của bạn dưới dạng tài nguyên Windows. Sau đó, mã nguồn được tích hợp vào tệp thực thi của bạn. Trong reasource (rc) tập tin của bạn, bạn sẽ thêm một cái gì đó như thế này:

IDR_OPENCL_FILE_1   OPENCL_SOURCE   "mydir\\myfile.cl" 

Sau đó, trong nguồn máy chủ, một cái gì đó như thế này:

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

Trên Linux, objcopy sẽ cho phép bạn làm điều gì đó giống. Bạn có thể xây dựng một elf. Với tệp nguồn được xuất dưới dạng biểu tượng. Rất tiếc, tôi không có đoạn mã nào tiện dụng cho điều đó ngay bây giờ.

Tôi ước có một câu trả lời độc lập về nền tảng tốt hơn. Nếu bạn bắt gặp nó, hãy cho tôi biết.

+0

Một giải pháp nền tảng độc lập sẽ là Qt's moc hoặc xxd qua cygwin/msys hoặc một cái gì đó tương tự. – Macke

Các vấn đề liên quan