2013-01-31 35 views
5

Tôi muốn NVCC để điều trị những cảnh báo dưới đây là một lỗi:mức cảnh báo NVCC

warning : calling a __host__ function("foo") from a __host__ __device__ function("bar") 

NVCC tài liệu "NVIDIA CUDA biên dịch driver NVCC" thậm chí không chứa từ "cảnh báo".

+0

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

Trả lời

2

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.

+0

Tôi chỉ tìm kiếm một vụ tai nạn do nvcc biên dịch hàm '__host__ __device__' gọi hàm' __host__' thành mã thiết bị vô nghĩa (cụ thể là đọc từ 0: 'mov.u32% r31, 0; ld.u32% r32, [% r31]; '). Có lý do nào để không sử dụng '--Werror cross-execution-space-call'? – masterxilo