2017-10-31 2 views
1

bemerkte mich, dass der folgende Code kompiliert mit g ++/Klirren ++ - 3.8 aber nicht mit nvcc:CUDA 8.0: Fehler beim Kompilieren mit Vorlage Freund in Namespace

#include <tuple> // not used, just to make sure that we have c++11 
#include <stdio.h> 

namespace a { 
template<class T> 
class X { 
    friend T; 
}; 
} 

erhalte ich den folgenden Compiler-Fehler:

/usr/local/cuda-8.0/bin/nvcc -std=c++11 minimum_cuda_test.cu 
nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning). 
minimum_cuda_test.cu:7:10: error: ‘T’ in namespace ‘::’ does not name a type 
    friend T; 

Interessanterweise funktioniert dies mit nvcc:

#include <tuple> // not used, just to make sure that we have c++11 
#include <stdio.h> 

template<class T> 
class X { 
    friend T; 
}; 

Ist das ein Bug im Compiler? Ich dachte, nvcc würde intern g ++ oder clang als Compiler verwenden, daher bin ich verwirrt, warum das mit meinem lokalen Compiler funktionieren würde, aber nicht mit nvcc.

Antwort

2

In beiden Fällen wird der Code von g ++ kompiliert. Wenn Sie jedoch eine .cu-Datei an nvcc übergeben, wird der Code über das CUDA C++ - Frontend übergeben, bevor er an den Host-Compiler übergeben wird. Mit Blick auf CUDA 8 mit gcc 4.8, sehe ich, dass der Code von

transformiert wurde
namespace a { 
template<class T> 
class X { 
    friend T; 
}; 
} 

zu

namespace a { 
template< class T> 
class X { 
friend ::T; 
}; 

Sie können sehen, dass das vordere Ende des Templat-Freund mit einem Äquivalent ersetzt hat, aber mit ein vorangestellter anonymer Namespace, der die Kompilierung durchbricht. Ich bin kein C++ - Sprachanwalt, aber das scheint mir ein Fehler im CUDA-Frontend zu sein. Ich würde vorschlagen, es NVIDIA zu melden.

+0

Ich sehe, das würde es erklären. Nebenbei bemerkt: Wie kann ich die Ausgabe des CUDA C++ Frontends sehen? –

+0

@MatthiasSpringer: Sie können '-v --keep' an nvcc übergeben, das Ihnen anzeigt, wo im Kompilierungsprozess der Fehler aufgetreten ist und welche Eingabedatei verarbeitet wurde, und dann diese Eingabedatei selbst überprüfen. – talonmies