2013-05-01 83 views
6

Có ai biết cách kiểm tra xem mã đang chạy trên GPU hay CPU bằng Cuda không?Kiểm tra xem mã đang chạy trên GPU hay CPU

__device__ __host__ double count_something(double variable) { 
    if (RUN_ON_GPU) { 
    use_cuda_variables(); 
    } else { 
    use_cpu_variables(); 
    } 
} 

Trả lời

11

Không có cách nào để runtime séc kiến ​​trúc một đoạn mã đang chạy trên, nhưng cũng không cần phải biết, bởi vì nó có thể được xác định tại thời gian biên dịch và xử lý cho phù hợp. nvcc xác định một số ký hiệu tiền xử lý có thể được sử dụng để phân tích cú pháp quỹ đạo biên dịch khi mã đang được biên dịch. Biểu tượng khóa là __CUDA_ARCH__ không bao giờ được xác định khi biên dịch mã máy chủ và luôn được xác định khi biên dịch mã thiết bị.

Vì vậy, chúng ta có thể viết một hàm như thế này:

__device__ __host__ float function(float x) 
{ 
#ifdef __CUDA_ARCH__ 
    return 10.0f * __sinf(x); 
#else 
    return 10.0f * sin(x); 
#endif 
} 

mà sẽ phát ra đoạn mã khác nhau tùy thuộc vào việc nó được biên soạn cho GPU hoặc máy chủ. Bạn có thể đọc một cuộc thảo luận kỹ lưỡng hơn về chỉ đạo biên soạn trong phần Stack Overflow question này hoặc trong phần C language extensions của hướng dẫn lập trình CUDA.

+0

Điều này không hoàn toàn chính xác. Trong một số trường hợp, mã này không hoạt động - Tôi đã dành rất nhiều thời gian để gỡ lỗi trước khi tìm ra giải pháp. – avtomaton

+0

@avtomaton: Điều gì không đúng? Làm thế nào để gỡ lỗi phù hợp với những gì có hiệu quả chỉ là mã tiền xử lý C++? – talonmies

+1

Điều này không hoàn toàn chính xác. Trong một số trường hợp, mã này không hoạt động - Tôi đã dành rất nhiều thời gian để gỡ lỗi trước khi tìm ra giải pháp. '__CUDA_ARCH__' có thể được xác định ngay cả trong mã máy chủ, nhưng nó được định nghĩa là 0 trong trường hợp này. Do đó, việc kiểm tra thích hợp là như sau: '__device__ __host__ float function (float x) { #if (được xác định (__ CUDA_ARCH__) && (__CUDA_ARCH__> 0)) return 10.0f * __sinf (x); #else // mã máy chủ tại đây #endif } ' – avtomaton

2

Tôi không thể thêm đánh dấu mã thích hợp trong các nhận xét - đã quyết định thêm câu trả lời đầy đủ. Chỉ sử dụng __CUDA_ARCH__ xác định việc kiểm tra không hoàn toàn chính xác. Trong một số trường hợp, mã này không hoạt động - Tôi đã dành rất nhiều thời gian để gỡ lỗi trước khi tìm thấy giải pháp (tài liệu CUDA chưa đề cập đến nó).
__CUDA_ARCH__ có thể được xác định ngay cả trong mã máy chủ nhưng được xác định là 0 trong trường hợp này. Do đó, kiểm tra thích hợp là một cái gì đó như thế này:

__device__ __host__ float function(float x) 
{ 
#if (defined(__CUDA_ARCH__) && (__CUDA_ARCH__ > 0)) 
    // device code here 
    return 10.0f * __sinf(x); 
#else 
    // host code here 
    return 10.0f * sin(x); 
#endif 
} 
Các vấn đề liên quan