2012-10-02 35 views
5

Làm thế nào tôi có thể nhận được khả năng tính toán CUDA (phiên bản) trong thời gian biên dịch trướC#define? Ví dụ, nếu tôi sử dụng __ballot và biên dịch vớiTôi có thể nhận được khả năng tính toán CUDA (phiên bản) trong thời gian biên dịch trướC#define không?

nvcc -c -gencode arch=compute_20,code=sm_20 \ 
     -gencode arch=compute_13,code=sm_13 
     source.cu 

tôi có thể nhận được phiên bản của khả năng tính toán trong mã của tôi bằng cách #define cho chọn chi nhánh của mã với __ballot và không có?

Trả lời

15

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____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 
+0

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

+1

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

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