Trích dẫn hướng dẫn tham khảo NVCC của CUDA COMPILER DRIVER, Phần 3.2.8. "Generic Tool Options":
--Werror kind
Make warnings of the specified kinds into errors. The following is the list of warning kinds accepted by this option:
cross-execution-space-call
Be more strict about unsupported cross execution space calls. The compiler will generate an error instead of a warning for a call from a __host__ __device__
to a __host__
function.
Vì vậy, làm như sau:
Project -> Properties -> Configuration Properties -> CUDA C/C++ -> Command Line -> Quang học bổ sung -> add - Werror cross-thi-gian-gọi
chương trình thử nghiệm này
#include <cuda.h>
#include <cuda_runtime.h>
void foo() { int a = 2;}
__host__ __device__ void test() {
int tId = 1;
foo();
}
int main(int argc, char **argv) { }
lợi nhuận các cảnh báo sau đây
warning : calling a __host__ function("foo") from a __host__ __device__ function("test") is not allowed
mà không có sự lựa chọn biên soạn thêm nêu trên và trả về lỗi sau
Error 3 error : calling a __host__ function("foo") from a __host__ __device__ function("test") is not allowed
với nêu trên tùy chọn biên soạn bổ sung.
Tại sao đây không phải là lỗi do thiết kế? Tôi chỉ có kinh nghiệm nvcc biên dịch thành công này (chỉ với cảnh báo bạn đã đề cập): '__host__ int c() {return 0; } __host__ __device__ void b() {int a = c();} __global__ void a() {b();} /*...*/ a <<<1, 1 > >>(); 'và dòng' a = c(); 'được biến thành một giá trị đọc từ 0:' mov.u32% r1, 0; ld.volatile.u32% r2, [% r1]; 'có thể * không bao giờ * làm việc và chắc chắn không phải là những gì tôi dự định. Tại sao trình biên dịch nên tiến hành với điều này? – masterxilo