2013-03-03 25 views
12

Có thể biên dịch OpenCL bằng Mingw và Nvidia SDK không?Biên dịch OpenCL trên Mingw Nvidia SDK

Tôi biết rằng nó không được hỗ trợ chính thức nhưng điều đó không có ý nghĩa. Không phải là các thư viện được cung cấp như một thư viện liên kết tĩnh? Tôi có nghĩa là một khi biên dịch với bất kỳ trình biên dịch có thể được, và liên kết thành công, whats nên được vấn đề?

Tôi đã quản lý để biên dịch và liên kết thành công mã của mình với thư viện OpenCL được cung cấp với SDK của Nvidia, tuy nhiên tệp thực thi sẽ ném Phân đoạn lỗi tại số clGetPlatformIDs, đây là cuộc gọi OpenCL đầu tiên trong mã của tôi.

Đây là lệnh biên soạn của tôi

x86_64-w64-mingw32-g++ -std=c++11 File.cpp \ 
-L"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\x64" \ 
-I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include" \ 
-gcoff -lOpenCL -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 \ 
-lshell32 -lole32 -loleaut32 \ 
-luuid -lodbc32 -lodbccp32 -luser32 -lgdi32 -lmingwex -m64 \ 
-DWIN32 -D_DEBUG -D_CONSOLE 

Lưu ý rằng các thư viện này được lấy từ file sln của mã mẫu OpenCL.

Tôi đã thử các kết hợp khác nhau của các thư viện này và dường như không có gì hoạt động.

Cũng có cách để biên dịch bằng Mingw và liên kết bằng cách sử dụng cái gì khác? Tôi không chắc điều gì khác có thể xảy ra.

+0

Tại sao bạn không sử dụng VC++ Express, để xây dựng mã máy chủ? Ngoài ra bạn đang sử dụng 32 bit hoặc 64bit libs? Có một sự pha trộn khó hiểu của CUDA \ v5.0 \ lib \ x64 và -luse32 -lcomdlg32 -ladvai32 ... -m64 là tất cả các libs cần thiết? Đơn giản hóa dòng lệnh của bạn. –

+1

64-bit, mã C++ của tôi sử dụng các tính năng C++ 11 để VC++ không hoạt động. Tôi đã thử xóa và thêm libs, dead end. – omarzouk

Trả lời

12

Chúng tôi đã có thể thực hiện việc này bằng cách sử dụng tiện ích mở rộng và tiện ích dlltool của MinGW để tạo thư viện nhập "libOpenCL.a" cho tệp DLL "OpenCL.dll". Dưới đây là các bước mà chúng tôi đã theo dõi:

  • Bước 1: Đảm bảo bạn đã cài đặt mingw-utils (cho reimp và dlltool). Nếu bạn không, tại một MinGW dấu nhắc, gõ:

    mingw-get install mingw-utils

  • bước 2: Tiếp theo, gõ lệnh sau:

    reimp OpenCL.lib

Điều này sẽ mang lại tệp OpenCL.def và libOpenCL.a. Nếu kết quả là một cái gì đó dọc theo dòng "thư viện nhập không hợp lệ hoặc bị hỏng", bước thay thế 2 sẽ hoạt động.

  • thay thế bước 2: Sử dụng dlltool cùng với một file .def mà bạn có thể tìm thấy ở đây: http://pastebin.com/f2ac38b2f. Lệnh trở thành:

    dlltool -l libOpenCL.a -d OpenCL.def -A -k

Bây giờ bạn có thể liên kết chống lại libOpenCL.a mới được tạo ra. Nếu bạn vẫn thấy các biểu tượng bị thiếu, hãy thêm chúng vào tệp .def và lặp lại lệnh dlltool.

Chúng tôi đã có thể có được điều này tất cả nhờ làm việc với các thông tin tìm thấy trong bài viết sau đây, để tham khảo:

  1. http://oscarbg.blogspot.com/2009/12/opencl-with-mingw.html
  2. http://www.mingw.org/wiki/CreateImportLibraries (Tôi chỉ có thể dán 2 liên kết)
+0

Xác nhận rằng điều này cho phép bạn liên kết ít nhất với GPU Computing SDK 5.5. – imallett

2

OpenCL thư viện chỉ là sơ khai cho OpenCL.dll. Do đó, tôi khuyên bạn nên sử dụng kỹ thuật tải động.Nó sẽ đơn giản giải quyết mọi vấn đề của bạn. Hoặc bạn có thực sự cần một số chỉnh sửa nVIDIA của OpenCL?

Nó không chỉ an toàn hơn khi chạy, mà còn dễ biên dịch hơn vì bạn không cần liên kết cũng như định nghĩa, cũng không phải bất kỳ thứ gì. Chỉ cần một tệp cpp/hpp đơn giản được thêm vào proyect của bạn.

Rất tốt để sử dụng là CLEW. Tuy nhiên tôi không đồng ý hoàn toàn với thư viện đó, bởi vì trình bao bọc C++ bị hỏng. Vì vậy, có lẽ bạn sẽ cần một số tinh chỉnh. Ngoài ra tôi thường vô hiệu hóa mã "atexit", vì nó có thể có vấn đề.

+0

có vẻ như đã chết? – rogerdpack