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