如何在 Ubuntu 16.10 中设置 CUDA 中的 OpenCL?

如何在 Ubuntu 16.10 中设置 CUDA 中的 OpenCL?

我正在尝试编译一个使用 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,因此将这些文件添加到构建中可以修复此问题。

相关内容