2011-10-01 43 views
14

Tôi đã làm việc với OpenCL trên một vài dự án, nhưng luôn viết hạt nhân làm một (đôi khi khá lớn). Bây giờ tôi đang làm việc trên một dự án phức tạp hơn và muốn chia sẻ các chức năng trên một số hạt nhân.Làm thế nào để cấu trúc hạt nhân OpenCL lớn?

Nhưng các ví dụ tôi có thể tìm thấy tất cả hiển thị hạt nhân dưới dạng tệp đơn (rất ít thậm chí gọi hàm phụ). Có vẻ như có thể sử dụng nhiều tệp - clCreateProgramWithSource() chấp nhận nhiều chuỗi (và kết hợp chúng), mặc dù pyopencl's Program() chỉ lấy một nguồn duy nhất.

Vì vậy, tôi muốn nghe từ bất cứ ai có kinh nghiệm làm điều này:

  • Có bất kỳ vấn đề liên quan đến nhiều file nguồn?
  • Giải pháp tốt nhất cho pyopencl có đơn giản là ghép nối các tệp không?
  • Có cách nào để biên dịch một thư viện các hàm (thay vì truyền trong thư viện nguồn với mỗi hạt nhân, ngay cả khi không phải tất cả đều được sử dụng)?
  • Nếu cần phải chuyển vào nguồn thư viện mọi lúc, các chức năng không sử dụng đã bị hủy bỏ (không có phí)?
  • Bất kỳ phương pháp hay đề xuất hay nhất nào khác?

Cảm ơn.

+2

Bạn có thể tạo một tệp nối có #include "part1.cl" #include "part2.cl". Điều này làm việc cho tôi (trình biên dịch NVidia), mặc dù mọi thứ có thể được biên dịch mỗi khi ứng dụng chạy. Tôi nghĩ rằng có một thư viện các chức năng biên dịch trước là một chút khoa học viễn tưởng, vì mã chức năng được gạch chân vào mỗi hạt nhân (đó là lý do tại sao bạn không thể viết các hàm đệ quy). –

Trả lời

6

Tôi không nghĩ OpenCL có khái niệm về nhiều tệp nguồn trong một chương trình - một chương trình là một đơn vị biên dịch. Tuy nhiên, bạn có thể sử dụng #include và kéo các tiêu đề hoặc các tệp .cl khác vào thời gian biên dịch.

Bạn có thể có nhiều hạt nhân trong chương trình OpenCL - vì vậy, sau khi biên dịch, bạn có thể gọi bất kỳ tập hợp hạt nhân nào được biên dịch.

Bất kỳ mã nào không được sử dụng - chức năng, hoặc bất kỳ thứ gì được biết là không thể truy cập được - có thể được giả định là bị loại bỏ trong quá trình biên dịch, với một số chi phí nhỏ để biên dịch thời gian.

+0

cảm ơn. đây là những gì tôi đang làm. nhưng, bực bội, pyopencl không tính đến nội dung #include khi nhân bộ nhớ đệm. do đó việc thay đổi các tệp "thư viện" không ảnh hưởng đến hạt nhân được biên dịch mà không xóa bộ nhớ cache theo cách thủ công. anyway, tôi sẽ chờ đợi để xem nếu ai đó có một ý tưởng tốt hơn trước khi đánh dấu bạn là tốt nhất (và chỉ!). cổ vũ. –

+0

Nếu đó là sự thật, thì cú pháp của clCreateProgramWithSource là khá khó xử, phải không? Nó yêu cầu rõ ràng nhiều chuỗi và độ dài của mỗi chuỗi đó. Tôi không chắc chắn nó thực sự hoạt động (tôi đã ở đây cố gắng để làm cho nó hoạt động) nhưng nó âm thanh kỳ lạ mà nó không thể làm việc cho cú pháp ... – user1111929

5

Trong OpenCL 1.2, bạn liên kết các tệp đối tượng khác nhau với nhau.

+0

cảm ơn; sẽ cố gắng này khi tôi nhận được trở lại làm việc hàng đầu opencl. –

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