2017-06-27 13 views
-2

問題

私は小さなCUDAプログラムをたくさん書いています。それらのほとんどは、デバッグおよびリリースビルドで正常にコンパイルされます。しかし、さまざまなGCCイントリンシックに間違った型のポインタが与えられているため、リリースモードでコンパイルするといくつか失敗します。 しかし、実際に組み込み関数を使用していません。このプログラムは、部分的に私の問題を再現:GCCのコンパイラエラー(CUDA経由)組み込み関数ですが、私は使用していません

#include <iostream> 
#include <cuda_runtime.h> // To pacify the syntax highlighter 
#include <immintrin.h> // NOTE: I don't ever include this header in my real code 

__global__ void kernel() { 
    // Do nothing 
} 

using namespace std; 

int main() { 
    kernel<<<1, 1>>>(); 
    cout << "Hello, world!" << endl; 

    return 0; 
} 

問題、しかし、私の実際のコードに私は<immintrin.h>を含めるか、どのような種類のGCCの組み込み関数を使用しないことです。私が使っているライブラリのコードがあるかもしれませんが、わかりません。この例から<immintrin.h>を削除すると、プログラムはコンパイルされて正常に実行されます。あなたがそれらを見たい場合は

実際犯罪者は、herehereです。

関連する事実

  • 私は、以下のソフトウェア使用しています:

    • をUbuntuの17.04
    • nvccバージョン8.0.44
    • gccバージョン5.4.1
    • cmakeバージョン3.8 .20170418
  • プロジェクトは、上記のサンプルプログラムを含め、デバッグモードで完全に正常に構築され、実行されます。

  • 私の小さなCUDAプログラムの多くはですが、リリースビルドではうまくコンパイルされますが、失敗したもののパターンは特定できません。
    • /usr/bin/g++-5 -std=c++11 -fopenmp -O3 -DNDEBUG -rdynamic CMakeFiles/DotProduct.dir/DotProduct_generated_main.cu.o CMakeFiles/DotProduct.dir/DotProduct_intermediate_link.o -o DotProduct -Wl,-Bstatic -lcudart_static -Wl,-Bdynamic -lpthread -ldl -lrt ../../Common/libCommon.a -Wl,-Bstatic -lcudart_static -Wl,-Bdynamic -lpthread -ldl -lrt -Wl,-Bstatic -lcudadevrt -Wl,-Bdynamic -L/usr/lib/x86_64-linux-gnu -lSDL2 -lSDL2_ttf -lSDL2 -lGLEW -lGLU -lGL
  • フルビルドログを添付するにはあまりにも大きいですが、hereを見つけることができます:
  • リリースビルドコンパイルコマンドは次のとおりです。ここでは、エラーの関連するサンプルです:
 
/usr/lib/gcc/x86_64-linux-gnu/5/include/avx512fintrin.h(9533): error: argument of type "void *" is incompatible with parameter of type "long long *" 
/usr/lib/gcc/x86_64-linux-gnu/5/include/avx512fintrin.h(9542): error: argument of type "void *" is incompatible with parameter of type "long long *" 
/usr/lib/gcc/x86_64-linux-gnu/5/include/avx512pfintrin.h(54): error: argument of type "const void *" is incompatible with parameter of type "const long long *" 
/usr/lib/gcc/x86_64-linux-gnu/5/include/avx512pfintrin.h(62): error: argument of type "const void *" is incompatible with parameter of type "const int *" 
/usr/lib/gcc/x86_64-linux-gnu/5/include/avx512pfintrin.h(70): error: argument of type "const void *" is incompatible with parameter of type "const long long *" 
/usr/lib/gcc/x86_64-linux-gnu/5/include/avx512pfintrin.h(78): error: argument of type "const void *" is incompatible with parameter of type "const int *" 
/usr/lib/gcc/x86_64-linux-gnu/5/include/avx512pfintrin.h(86): error: argument of type "void *" is incompatible with parameter of type "const long long *" 
  • エラー・ログには、実際にこれらの組み込み関数を使用している人は言っていません。
  • 結局のところ、以下のように、ヘッダの配列は:<random> - ><opt_random.h> - ><x86intrin.h> - ><immintrin.h> - >(エラーログに記載されたすべての他のヘッダ)。私の新しい目標は、通常の最適化をすべてを除く)にすることです。
+0

互換性のない型に明示的なキャストを追加する必要があります。つまり、myLongLongPtr =(long long *)myVoidPtr; – Serge

+0

@Sergeどこですか?私は実際にそれらの機能を使用していないと私は誰がわからない。 – JesseTG

+0

CUDAは、コンパイラのバージョンまたはオペレーティングシステムをサポートしていません。 http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#axzz4lB5unFj4 – talonmies

答えて

1

これは、特定のシステム構成に対するCUDAの述べられていないサポートに起因する可能性があることがわかりました(nvcc)。私は報告書hereを提出しました(あなたはそれを見るためにログインする必要があります)。

今のところ、私は組み込み関数を必要とするものを使用しないで回避しました。私の場合、the standard library'sの代わりにThrust's random number generatorsを使用しました。私が話した人は、nvccで処理されたソースファイルに<immintrin.h>が含まれないように、ホストとデバイスのコードをより慎重に分離できることを示唆しました。試してみたことはありませんが、将来これを見ている人にとっては価値があります。

関連する問題