Regular C/Hằng số kiểu C++: Trong CUDA C (chính nó là một sửa đổi của C99) hằng số là các thực thể thời gian biên dịch tuyệt đối. Điều này là không đáng ngạc nhiên khi số lượng tối ưu hóa xảy ra trong NVCC là RẤT liên quan đến bản chất của xử lý GPU.
#define
: macro luôn kém chất lượng nhưng hữu ích trong một nhúm.
Trình xác định biến số __constant__
là, tuy nhiên một động vật hoàn toàn mới và một cái gì đó của một từ ngữ sai theo ý kiến của tôi. Tôi sẽ đặt xuống những gì Nvidia có here trong không gian dưới đây:
Các __constant__
vòng loại, tùy chọn sử dụng cùng với __device__
, khai báo một biến:
- nằm trong không gian bộ nhớ liên tục,
- Có tuổi thọ của một ứng dụng,
- Có thể truy cập từ tất cả các chuỗi trong lưới và từ máy chủ thông qua thư viện thời gian chạy (cudaGetSymbolAddress()/ cudaGetSymbolSize()/cudaMemcpyToSymbol()/cudaMemcpyFromSymbol()).
tài liệu của Nvidia xác định rằng __constant__
có sẵn tại đăng ký mức tốc độ (gần như zero độ trễ) miễn là nó là hằng số tương tự được truy cập bởi tất cả các chủ đề của một warp.
Chúng được khai báo ở phạm vi toàn cầu trong mã CUDA. BAO GIỜ dựa trên kinh nghiệm cá nhân (và hiện đang diễn ra), bạn phải cẩn thận với specifier này khi nói đến việc biên dịch riêng biệt, như tách mã CUDA của bạn (.cu và.tập tin cuh) từ mã C/C++ của bạn bằng cách đặt các hàm bao bọc trong các tiêu đề kiểu C.
Không giống như các biến được chỉ định "cố định" truyền thống tuy nhiên chúng được khởi tạo khi chạy từ mã máy chủ cấp phát bộ nhớ thiết bị và cuối cùng khởi chạy hạt nhân. Tôi lặp lại tôi hiện đang làm việc mã chứng minh rằng này có thể được thiết lập tại thời gian chạy bằng cách sử dụng cudaMemcpyToSymbol() trước khi thực hiện hạt nhân.
Chúng khá tiện lợi khi nói rằng ít nhất là tốc độ cấp bộ nhớ cache L1 được đảm bảo để truy cập.
hằng số được biết tại thời gian biên dịch phải được xác định bằng cách sử dụng macro tiền xử lý (tức là '# define'). Trong các trường hợp khác, '__constant__' [variables] (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#constant) có thể là một tùy chọn mà lập trình viên CUDA sử dụng để tối ưu hóa mã truy cập các biến được tính không thay đổi. Lưu ý rằng việc bạn sử dụng '" M "' để tham chiếu một biểu tượng không còn hợp lệ trong cuda 5. –
Sẽ rất thú vị khi biết sự khác biệt thời gian chạy giữa hai khả năng này là như thế nào. Tôi đang làm việc trên một số mã cfd và tôi muốn chuyển các tham số như các tùy chọn cho programm, do đó nó sẽ là cần thiết để sử dụng cách tiếp cận đầu tiên. Mặt khác, nếu tôi sử dụng macro tiền xử lý, điều này sẽ không thể thực hiện được. – jrsm
Vì ví dụ thứ hai của bạn không tạo ra mã máy của bất kỳ loại nào, đây không phải là một câu hỏi hợp lý. Bạn cần phải đặt ra một kịch bản sử dụng thời gian chạy thực tế để làm cho bất kỳ ý nghĩa của câu hỏi đó. Đối với tải ban đầu của một giá trị trực tiếp vô hướng đơn vào một biến hoặc đăng ký, phương pháp thứ hai sẽ luôn luôn nhanh hơn. –