問題
私は小さな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>
を削除すると、プログラムはコンパイルされて正常に実行されます。あなたがそれらを見たい場合は
関連する事実
私は、以下のソフトウェア使用しています:
- をUbuntuの17.04
nvcc
バージョン8.0.44gcc
バージョン5.4.1cmake
バージョン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>
- >(エラーログに記載されたすべての他のヘッダ)。私の新しい目標は、通常の最適化をすべて(を除く)にすることです。
互換性のない型に明示的なキャストを追加する必要があります。つまり、myLongLongPtr =(long long *)myVoidPtr; – Serge
@Sergeどこですか?私は実際にそれらの機能を使用していないと私は誰がわからない。 – JesseTG
CUDAは、コンパイラのバージョンまたはオペレーティングシステムをサポートしていません。 http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#axzz4lB5unFj4 – talonmies