2011-09-12 29 views
11

Tôi đang cố gắng để có được các ràng buộc OpenCLRaw đến một điểm mà tôi có thể sử dụng chúng trên các cửa sổ. Tôi đã chia rẽ repo OpenCLRaw trên github để tôi có thể sửa đổi nếu cần. Chi nhánh của tôi ở đây: https://github.com/dagit/OpenCLRawKhông thể liên kết OpenCL trên Windows với GHC

Tôi chủ yếu làm việc từ chi nhánh "FunPtr" của mình. Vấn đề tôi gặp phải là: Tôi đã cài đặt SDK OpenCL của AMD, chuyển đổi tệp .lib cụ thể của Visual Studio thành tệp mà gcc có thể xử lý (tệp .a), nhưng ghc dường như không liên kết với nó . Tôi nhận được các ký hiệu không xác định cho mọi thứ tôi sử dụng trong API OpenCL.

Tôi có thể tạo chương trình C "nhỏ" và liên kết nó bằng tệp .a mà tôi đã tạo và gcc từ mingw (không phải từ cài đặt Haskell). Tôi đang sử dụng phiên bản Windows mới nhất của nền tảng Haskell.

Đây là những bước tôi đã sử dụng để tạo ra các tập tin .a: http://forums.amd.com/forum/messageview.cfm?catid=390&threadid=138890

tôi đã sử dụng các lệnh trong ví dụ kịch bản (ví dụ, gendef và dlltool). Tôi đã cố gắng sử dụng 32 bit mọi thứ càng nhiều càng tốt, như tôi biết rằng GHC sẽ muốn tất cả mọi thứ là 32bit, vì vậy tôi không nghĩ rằng đó là một vấn đề 32bit so với 64bit.

Có ai biết nếu có điều gì đó khác biệt về cách gọi gcc dưới ghc thay vì gcc mà tôi nhận được từ mingw không?

Tôi cũng đã chơi với dòng lệnh ghc (Tôi đã sử dụng cabal-dev --verbose = 3 để kiểm tra dòng lệnh) và tôi vẫn không thể làm mát nó thành trạng thái hoạt động.

Mọi trợ giúp sẽ được đánh giá cao!

+0

Nếu tôi sử dụng pexports thay vì gendef thì nó sẽ loại bỏ tất cả các @ sau tên hàm. Điều này cho phép GHC sử dụng tệp thư viện để liên kết nhưng bây giờ a) gcc không liên kết với tệp đó và b) segfaults chương trình tầm thường của tôi khi nó gọi clGetPlatfromIDs. –

+0

Tôi không thử nghiệm nó trên Windows, nhưng tôi nhận thấy rằng OpenCLRaw có một số lỗi với loại, tôi madfe bản thân mình một ràng buộc opencl làm việc cho tôi, https://github.com/zhensydow/opencl – Zhen

+0

@Zhen, bạn có kế hoạch nào không để đặt sự ràng buộc của bạn vào Hackage?Nơi đầu tiên tôi tìm kiếm nội dung haskell là hackage, tiếp theo là tìm kiếm google. Thư viện của bạn trông giống như một cải tiến so với Jeff's. Đó là một sự xấu hổ nó không hiển thị trên hackage và google. –

Trả lời

3

OpenCL sử dụng quy ước stdcall, nhưng OpenCLRaw đang sử dụng ccall. Điều này tạo ra một số vấn đề. Điều chính là người liên kết muốn các ký hiệu tên hàm kết thúc bằng @NN, nơi NN phụ thuộc vào hàm.

Khi nó quay ra, cách chính xác để tạo ra libOpenCL.a là như sau (từ một vỏ mingw):

cp /c/Windows/System32/OpenCL.dll . 
gendef OpenCL.dll 
dlltool -l libOpenCL.a -d OpenCL.def -k -A 

này sẽ tạo ra libOpenCL.a rằng GHC có thể sử dụng một cách chính xác để liên kết, nhưng chỉ nếu OpenCLRaw được sửa đổi để sử dụng lệnh stdcall thay vì ccall.

Bây giờ tôi đã hiểu được sự cố tôi có thể sửa các liên kết OpenCLRaw để thực hiện điều đúng trên Windows.

Khi tôi sử dụng pexports thay vì gendef, tôi có thể xóa @NN khỏi tên biểu tượng, nhưng sau đó chương trình kết quả bắt đầu bị phân đoạn. Điều này là do biểu tượng đã được tìm thấy nhưng quy ước gọi là không chính xác, có thể dẫn đến các ngăn xếp bị hỏng.

Bài học chính cho tôi là ràng buộc FFI của bạn phải phù hợp với quy ước gọi điện của thư viện C của bạn.

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