Có. Trước tiên, tốt nhất là bạn nên hiểu điều gì sẽ xảy ra khi bạn sử dụng -gencode
. NVCC sẽ biên dịch mã thiết bị đầu vào của bạn nhiều lần, một lần cho mỗi cấu trúc đích của thiết bị. Vì vậy, trong ví dụ của bạn, NVCC sẽ chạy giai đoạn biên dịch 1 một lần cho compute_20 và một lần cho compute_13.
Khi nvcc biên dịch tệp .cu, nó định nghĩa hai macro tiền xử lý, __CUDACC__
và __CUDA_ARCH__
. __CUDACC__
không có giá trị, nó chỉ đơn giản được xác định nếu cudacc là trình biên dịch, và không được xác định nếu nó không phải là.
__CUDA_ARCH__
được xác định thành giá trị nguyên thể hiện phiên bản SM đang được biên dịch.
- 100 = compute_10
- 110 = compute_11
- 200 = compute_20
vv Để trích dẫn tài liệu NVCC kèm với CUDA Toolkit:
Kiến trúc xác định vĩ mô __CUDA_ARCH__
được gán một chuỗi giá trị gồm ba chữ số xy0
(kết thúc bằng chữ 0) trong mỗi nvcc c giai đoạn biên dịch 1 biên dịch cho compute_xy
. Macro này có thể được sử dụng trong việc triển khai các chức năng GPU để xác định kiến trúc ảo mà nó hiện đang được biên dịch. Mã máy chủ (mã không phải GPU) không được phụ thuộc vào nó.
Vì vậy, trong trường hợp của bạn, nơi bạn muốn sử dụng __ballot()
, bạn có thể làm điều này:
....
#if __CUDA_ARCH__ >= 200
int b = __ballot();
int p = popc(b & lanemask);
#else
// do something else for earlier architectures
#endif
Cảm ơn rất nhiều! Công việc của nó :) Và điều đó có nghĩa là gì: CUDA_VERSION? Nó có bằng số phiên bản của Bộ công cụ CUDA không? – Alex
Có, [xem tại đây ví dụ] (http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/docs/online/group__CUDA__TYPES_g3c09bba9b1547aa69f1e346b82bcdb50.html). Trên thực tế, đó là phiên bản chính lần 1000 + phiên bản nhỏ lần 10, vì vậy 4,2 -> 4020. – harrism