2016-10-17 10 views
5

Cụ thể, vấn đề của tôi là tôi có mã CUDA cần <curand_kernel.h> để chạy. Điều này không được bao gồm theo mặc định trong NVRTC. Có lẽ sau đó khi tạo ngữ cảnh chương trình (tức là cuộc gọi đến nvrtcCreateProgram), tôi phải gửi tên của tệp (curand_kernel.h) và cũng là mã nguồn của curand_kernel.h? Tôi cảm thấy mình không nên làm vậy.Làm thế nào để bạn bao gồm các thư viện CUDA chuẩn để liên kết với mã NVRTC?

Thật khó để nói; Tôi đã không quản lý để tìm một ví dụ từ NVIDIA của một ai đó cần các tập tin CUDA tiêu chuẩn như thế này như là một nguồn, vì vậy tôi thực sự không hiểu cú pháp là gì. Một số vấn đề: curand_kernel.h cũng đã bao gồm ... Tôi có phải làm tương tự cho mỗi điều này không? Tôi thậm chí không chắc chắn trình biên dịch NVRTC thậm chí sẽ chạy đúng trên curand_kernel.h, bởi vì có một số tính năng ngôn ngữ mà nó không hỗ trợ, phải không?

Tiếp theo: nếu bạn đã gửi mã nguồn của tệp tiêu đề đến nvrtcCreateProgram, tôi vẫn phải #include mã trong mã sẽ được thực hiện/có gây ra lỗi nếu tôi làm như vậy không?

Một liên kết tới mã ví dụ thực hiện điều này hoặc thứ gì đó giống như nó sẽ được đánh giá cao hơn nhiều so với câu trả lời đơn giản; Tôi thực sự không tìm được bất kỳ thứ gì.

Trả lời

6

Bạn phải gửi "tên tệp" và nguồn của từng tiêu đề riêng biệt.

Khi bộ xử lý trước thực hiện việc này, nó sẽ sử dụng bất kỳ tên tệp #include nào làm khóa để tìm nguồn cho tiêu đề, dựa trên bộ sưu tập mà bạn cung cấp. Tôi nghi ngờ rằng, trong trường hợp này, trình biên dịch (trình điều khiển) không có quyền truy cập hệ thống tập tin, vì vậy bạn phải cung cấp cho nó nguồn giống như cách bạn làm cho trình bao gồm trong OpenGL.

Vì vậy:

  • Bao gồm tên của tiêu đề của bạn khi gọi nvrtcCreateProgram. Trình biên dịch sẽ, nội bộ, tạo ra tương đương với một std::map<string,string> chứa nguồn của mỗi tiêu đề được lập chỉ mục theo tên đã cho.

  • Trong nguồn kernel của bạn, sử dụng #include "foo.cuh" như bình thường.

  • Trình biên dịch sẽ sử dụng foo.cuh như một chỉ số hoặc chìa khóa vào bản đồ nội bộ của mình (được tạo khi bạn gọi nvrtcCreateProgram), và sẽ lấy nguồn đánh đầu từ bộ sưu tập mà

  • tiền Compilation như bình thường.

Một trong những lý do mà nvrtc chỉ cung cấp một "tập hợp con" của tính năng là trình biên dịch đóng trong một môi trường hơi sandboxed, mà không nhất thiết phải có tất cả các công cụ hỗ trợ và các tiện ích nằm xung quanh mà bạn có với biên soạn ẩn . Vì vậy, bạn phải tự xử lý rất nhiều thứ mà sự kết hợp bình thường nvcc + (gcc | MSVC| clang) cung cấp.

Giải pháp có thể, nhưng không lý tưởng sẽ là xử lý trước tệp mà bạn cần trong IDE của bạn, lưu kết quả và sau đó là #include. Tuy nhiên, tôi đặt cược có một cách tốt hơn để làm điều đó. nếu bạn chỉ muốn curand, hãy xem xét việc đi sâu vào thư viện và trích xuất phần bạn cần (blech) hoặc sử dụng triển khai rand thân thiện với GPU khác.Trên các phiên bản CUDA cũ hơn, tôi vừa tạo ra một mảng lớn các float ngẫu nhiên trên máy chủ, tải nó lên GPU và lấy mẫu nó trong các hạt nhân.

This related link may be helpful.

+0

Hmmm. Vì vậy, tôi có một số suy nghĩ để làm về cách tôi thực hiện điều này. Pre-biên dịch mã có sử dụng curand vào PTX là không khả thi ... Pre-tạo phao trên CPU là không khả thi vì sẽ cần phải có cách quá nhiều ... Vì vậy, tôi còn lại với làm việc thông qua thư viện curand để có được những phần mà tôi cần để biên dịch bằng cách sử dụng NVRTC, và tìm một thực hiện khác của rand. Vì tất cả những gì tôi thực sự cần từ curand là PRNG thống nhất tiêu chuẩn từ 0 đến 1, tôi nghĩ giải pháp là tìm một PRNG khác dễ dàng hơn để biên dịch bằng NVRTC, cảm ơn! –

+0

Hmm. Việc triển khai GPU của PRNG khó có thể thực hiện được. Có lẽ tôi sẽ phải thích ứng với CURAND bằng cách nào đó ... –

+0

@BillySmith Giải pháp trực tiếp nhất là xây dựng một bộ đệm lớn và điền nó với rand() hoặc bên CPU tương tự, sau đó tải nó lên máy chủ. Giữ một biến chỉ mục cho biết giá trị nào là "tiếp theo" trong bộ đệm. Khi bạn nhấn vào cuối của bộ đệm, rửa sạch và lặp lại. –

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