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.
Đ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
@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
Đ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