我正在尝试编译一个使用 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
答案1
您的问题似乎与 OpenCL 或 CUDA 无关,而在于您构建此特定项目的方式。
要构建oclvanitygen
,请尝试运行make oclvanitygen
,或者手动构建:
gcc -o oclvanitygen oclvanitygen.c oclengine.c pattern.c util.c -lpcre -lcrypto -lm -pthread -lOpenCL
构建错误中列出的未定义的引用(例如vg_exec_context_new_key
)来自 vanitygen 项目本身的文件,而不是 OpenCL,因此将这些文件添加到构建中可以修复此问题。