2013-01-31 12 views
5

Chciałbym nvcc traktować jako ostrzeżenie poniżej błędu:poziom ostrzegawczy nvcc

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

nvcc dokumentacji „NVIDIA CUDA Compiler Kierowca nvcc” nawet nie zawierają słowo „ostrzeżenie”.

+0

Dlaczego ten błąd nie wynika z projektu? Właśnie doświadczyłem pomyślnego skompilowania nvcc (tylko z ostrzeżeniem, o którym wspomniałeś): '__host__ int c() {return 0; } __host__ __device__ void b() {int a = c();} __global__ void a() {b();} /*...*/ a <<<1, 1 > >>(); 'i wiersz' a = c(); 'zmienia się w odczyt z 0:' mov.u32% r1, 0; ld.volatile.u32% r2, [% r1]; 'które może * nigdy * działać i na pewno nie było to, co zamierzałem. Dlaczego kompilator powinien kontynuować? – masterxilo

Odpowiedz

2

Cytowanie instrukcji obsługi NVIDIA CUDA PRZEWODNIK NVCC, punkt 3.2.8. "Opcje standardowego narzędzia":

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

Dlatego, wykonaj następujące czynności:

Project -> Właściwości -> Właściwości konfiguracyjne -> CUDA C/C++ -> Wiersz poleceń -> Dodatkowe Optyka -> dodaj - Werror cross-wykonanie-space-call

Ten program testowy

#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) { } 

powraca następujące ostrzeżenie

warning : calling a __host__ function("foo") from a __host__ __device__ function("test") is not allowed 

bez wspomnianej dodatkowej opcji kompilacji i zwraca następujący błąd

Error 3 error : calling a __host__ function("foo") from a __host__ __device__ function("test") is not allowed 

z wyżej wymienioną dodatkową opcję kompilacji.

+0

Właśnie polowałem na awarię spowodowaną przez nvcc skompilowanie funkcji '__host__ __device__' wywołującej funkcję' __host__' w nonsensownym kodzie urządzenia (konkretnie odczytany z 0: 'mov.u32% r31, 0; ld.u32% r32, [% r31]; '). Czy istnieje jakikolwiek powód, aby nie używać '--Werror cross-execution-space-call'? – masterxilo