2013-04-29 37 views
6

Được rồi, tôi có một câu hỏi CUDA 5.0 thực sự đáng lo ngại về cách liên kết mọi thứ đúng cách. Tôi thực sự biết ơn vì sự giúp đỡ nào!Cách liên kết mã máy chủ với thư viện CUDA tĩnh sau khi biên dịch tách rời?

Sử dụng tính năng biên dịch có thể tách rời của CUDA 5.0, tôi đã tạo một thư viện tĩnh (* .a). Điều này liên kết độc đáo với các tập tin * .cu khác khi chạy qua nvcc, tôi đã làm điều này nhiều lần.

Bây giờ tôi muốn lấy tệp * .cpp và liên kết nó với mã máy chủ trong thư viện tĩnh này bằng cách sử dụng g + + hoặc bất kỳ thứ gì, nhưng không phải là nvcc. Nếu tôi cố gắng này, tôi nhận được lỗi biên dịch như

tài liệu tham khảo không xác định để __cudaRegisterLinkedBinary

Tôi đang sử dụng cả hai -lcuda-lcudart và, theo tôi biết, có các thư viện theo đúng thứ tự (có nghĩa là -lmylib -lcuda -lcudart). Tôi không nghĩ rằng đó là một vấn đề với điều đó. Có lẽ tôi sai, nhưng tôi cảm thấy tôi đang thiếu một bước và rằng tôi cần phải làm một cái gì đó khác để thư viện tĩnh của tôi (thiết bị liên kết?) Trước khi tôi có thể sử dụng nó với g + +.

Tôi đã bỏ lỡ điều gì đó quan trọng? Điều này thậm chí có thể?

Câu hỏi thưởng: Tôi muốn kết quả cuối cùng là thư viện động. Làm thế nào tôi có thể đạt được điều này?

+1

add '-lcudadevrt' –

+1

Tôi đã cố gắng đó, nó đã không không làm gì cả. Lệnh thực tế tôi đang sử dụng là: g ++ -pthread -shared -Wl, -O1 -Wl, -Bsymbolic-functions -Wl, -Bsymbolic-functions -Wl, -z, relro mycpplib.o mycudalib.a -L/usr/local/cuda-5.0/lib64 -L/usr/local/cuda-5.0/lib -lmystaticlib -lcuda -lcudart -lcudadevrt -o mylinkedlib.so - Tôi đang cố tạo một mô-đun Python cho thư viện CUDA của tôi. – user2333829

+0

Lỗi về __cudaRegisterLinkedBinary không xác định thực sự xảy ra khi tôi cố gắng nhập mô-đun Python. g ++ thực sự biên dịch mọi thứ mà không cần phàn nàn. – user2333829

Trả lời

7

Khi bạn liên kết với nvcc, nó sẽ tạo một liên kết thiết bị ngầm cùng với liên kết máy chủ. Nếu bạn sử dụng trình biên dịch máy chủ để liên kết (như với g ++), thì bạn cần phải thêm một bước rõ ràng để thực hiện liên kết thiết bị với tùy chọn –dlink, ví dụ:

nvcc –arch=sm_35 –dc a.cu b.cu 
nvcc –arch=sm_35 –dlink a.o b.o –o dlink.o 
g++ a.o b.o dlink.o x.cpp –lcudart 

Có ví dụ về chính xác điều này trong số Using Separate Compilation chapter of the nvcc doc.

Hiện tại, chúng tôi chỉ hỗ trợ các thư viện tĩnh cho mã thiết bị có thể định vị lại. Chúng tôi muốn tìm hiểu cách bạn muốn sử dụng mã như vậy trong thư viện động. Xin vui lòng trả lời trong các ý kiến.

Chỉnh sửa: "Có cách nào để sử dụng nvcc để biến mylib.a vào một cái gì đó có thể được đưa vào g ++"

Để trả lời các câu hỏi trong bình luận dưới đây

Chỉ cần sử dụng thư viện như một đối tượng, như thế này:

nvcc –arch=sm_35 –dlink mylib.a –o dlink.o 
g++ mylib.a dlink.o x.cpp –lcudart 
+0

Cảm ơn bạn, tôi nghĩ rằng đây là những gì tôi đã dò dẫm về phía. Bây giờ, điều duy nhất là tôi có một thư viện tĩnh liên kết thiết bị (mylib.a) thay vì các tệp * .o riêng lẻ. Tôi rõ ràng có thể sử dụng ar để trích xuất các tập tin * .o gốc, và sau đó làm chính xác những gì bạn mô tả. Có cách nào để sử dụng nvcc để biến mylib.a thành một cái gì đó có thể được đưa vào g + +? Giống như bước thứ hai của bạn, nhưng với "mylib.a" thay thế "a.o b.o". Hay tôi cần sử dụng ar để lấy lại các tệp đối tượng, sau đó thực hiện chính xác các bước thứ hai và thứ ba của bạn? – user2333829

+0

Để trả lời câu hỏi của bạn, tôi đang phát triển một thư viện C++ có nghĩa là có thể lưu trữ được từ Python. Python cần thư viện động. Tôi sử dụng thư viện tĩnh mà tôi đã tạo ra như một thư viện C++ có thể liên kết với thiết bị. – user2333829

+0

Tôi đã thêm câu trả lời cho câu hỏi của bạn trong nhận xét đầu tiên của bạn. Vui lòng chấp nhận/bỏ phiếu nếu điều này trả lời câu hỏi của bạn. – harrism

0

Bạn có thể sử dụng thư viện bất cứ nơi nào bạn sử dụng các đối tượng. Vì vậy, chỉ làm nvcc -arch = sm_35 -dlink mylib.a -o dlink.o g ++ mylib.a dlink.o x.cpp -lcudart

+1

Cảm ơn rất nhiều vì gợi ý của bạn, Mike, tôi đánh giá cao nó. Nhưng, tôi có hành vi lạ khi tôi thử chính xác lệnh nvcc mà bạn đã đề xuất. Có, lệnh nvcc chạy và không phàn nàn. Tuy nhiên, khi tôi thử và đặt tệp đối tượng mới thông qua g ++, có vẻ như tất cả các hàm của tôi đều không xác định. Việc kiểm tra nhanh kích thước tệp cho thấy mylib.a ban đầu là 988K, trong khi đối tượng sau khi liên kết thiết bị chỉ là 56K. Điều đó không thể đúng, bất kỳ ý tưởng gì? (Cảm ơn một lần nữa!) – user2333829

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