我正在尝试编译一个使用 OpenCL、CUDA 和 GPU 的程序。我尝试在我的 Ubuntu 16.10 GTX 1070 机器上安装 Nvidia 驱动程序、CUDA、cuDNN、GCC 和 OpenCL,并且在大多数情况下,一切似乎都在工作。但是,我仍然不确定如何设置 OpenCL 以便编译程序。
乍一看,我正在尝试编译oclvanitygen
,这是一个用于生成比特币钱包的 OpenCL 程序。当我尝试编译它时遇到了困难。
>git clone https://github.com/samr7/vanitygen.git
>cd vanitygen
>gcc -o oclvanitygen oclvanitygen.c -lOpenCL
/tmp/ccPaWgka.o: In function `main':
oclvanitygen.c:(.text+0x50c): undefined reference to `vg_exec_context_new_key'
oclvanitygen.c:(.text+0x529): undefined reference to `EC_KEY_get0_group'
oclvanitygen.c:(.text+0x53e): undefined reference to `EC_POINT_hex2point'
oclvanitygen.c:(.text+0x554): undefined reference to `EC_KEY_free'
oclvanitygen.c:(.text+0x815): undefined reference to `RAND_load_file'
oclvanitygen.c:(.text+0x894): undefined reference to `vg_regex_context_new'
oclvanitygen.c:(.text+0x8b8): undefined reference to `vg_prefix_context_new'
oclvanitygen.c:(.text+0x935): undefined reference to `vg_output_match_console'
oclvanitygen.c:(.text+0x947): undefined reference to `vg_output_timing_console'
oclvanitygen.c:(.text+0x9d4): undefined reference to `vg_context_add_patterns'
oclvanitygen.c:(.text+0xa28): undefined reference to `vg_read_file'
oclvanitygen.c:(.text+0xa9c): undefined reference to `vg_prefix_context_set_case_insensitive'
oclvanitygen.c:(.text+0xabb): undefined reference to `vg_context_add_patterns'
oclvanitygen.c:(.text+0xb37): undefined reference to `vg_read_password'
oclvanitygen.c:(.text+0xb86): undefined reference to `vg_check_password_complexity'
oclvanitygen.c:(.text+0xc33): undefined reference to `vg_ocl_context_new_from_devstr'
oclvanitygen.c:(.text+0xcdc): undefined reference to `vg_ocl_context_new'
oclvanitygen.c:(.text+0xd06): undefined reference to `vg_ocl_enumerate_devices'
oclvanitygen.c:(.text+0xd1c): undefined reference to `vg_context_start_threads'
oclvanitygen.c:(.text+0xd41): undefined reference to `vg_context_wait_for_completion'
oclvanitygen.c:(.text+0xd50): undefined reference to `vg_ocl_context_free'
collect2: error: ld returned 1 exit status
可能出了什么问题,我该如何解决?
下面列出了我如何设置系统的具体细节。我猜在让编译器访问 OpenCL 所需的内容方面,我做错了一些步骤。
我安装了Nvidia驱动程序。
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install \
nvidia-367 \
nvidia-prime \
nvidia-modprobe \
nvidia-opencl-dev
我安装了 CUDA。
sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda
这将 CUDA 安装在目录/usr/local/cuda-8.0
中。/usr/local/cuda-8.0/bin
我在 PATH 环境变量中包含了目录。
export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
我安装了 cuDNN。
tar -xvf cudnn-8.0-linux-x64-v5.1.tgz
cuDNN 存档包含以下内容:
cuda/include/cudnn.h
cuda/lib64/libcudnn.so
cuda/lib64/libcudnn.so.5
cuda/lib64/libcudnn.so.5.1.10
cuda/lib64/libcudnn_static.a
我将其中一些文件复制到其他目录,因为互联网告诉我这样做。
sudo cp cuda/include/cudnn.h /usr/local/cuda-8.0/include/
sudo cp cuda/lib64/* /usr/local/cuda-8.0/lib64/
我为 CUDA 安装并更改为 GCC 4.9。
sudo apt-get install gcc-4.9 g++-4.9
ln -fs /usr/bin/gcc-4.9 /usr/bin/gcc
ln -fs /usr/bin/g++-4.9 /usr/bin/g++
OpenCL 包含在 CUDA 中。我在目录中创建了指向 Nvidia OpenCL 标头的符号链接/usr/include
。
sudo ln -s /usr/include/nvidia-375/CL /usr/include
我也链接到已编译的 OpenCL 库文件:
sudo ln -s /usr/lib/x86_64-linux-gnu/libOpenCL.so.1 /usr/local/lib/libOpenCL.so
您的问题似乎与 OpenCL 或 CUDA 无关,而在于您构建此特定项目的方式。
要构建
oclvanitygen
,请尝试运行make oclvanitygen
,或手动构建它:构建错误中列出的未定义引用(例如
vg_exec_context_new_key
)来自 vanitygen 项目本身的文件,而不是 OpenCL,因此将这些文件添加到构建中可以修复它。