【发布时间】:2017-11-29 22:47:26
【问题描述】:
问题
我写了一堆小的 CUDA 程序。他们中的大多数在调试和发布版本中编译得很好。但是,在发布模式下编译时有一些失败,因为各种 GCC 内在函数被赋予了错误的指针类型。 但我实际上并没有使用内在函数。这个程序部分地重现了我的问题:
#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
-
nvcc8.0.44版 -
gcc5.4.1 版 -
cmake版本 3.8.20170418
项目在调试模式下构建和运行非常好,包括上面的示例程序。
大部分我的小型 CUDA 程序在 Release 版本中都能正常编译,但我无法在失败的程序中找出任何模式。- Release build编译命令如下:
/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。以下是错误的相关示例:
错误日志没有说明谁在实际使用这些内在函数。- 事实证明,标头的顺序如下:
<random>-><opt_random.h>-><x86intrin.h>-><immintrin.h>->(错误日志中提到的所有其他标头)。我现在的新目标是启用所有常见的优化除了那些内在函数。
【问题讨论】:
-
您需要为不兼容的类型添加显式强制转换,即 myLongLongPtr = (long long *)myVoidPtr;
-
@Serge 在哪里?我实际上并没有使用这些功能,也不知道是谁。
-
CUDA 不支持您的编译器版本或操作系统。 docs.nvidia.com/cuda/cuda-installation-guide-linux/…
-
升级到 CUDA 8.0.61 没有帮助...
-
我会更明确地重复一遍。没有任何版本的 CUDA 8 支持 Ubuntu 17,也不支持您正在使用的规范 gcc 5.4-1 构建
标签: c++ gcc compiler-errors cuda intrinsics