草庐IT

c++ - OpenCL 找不到平台?

coder 2024-02-18 原文

我正在尝试将 C++ API 用于 OpenCL。我已经安装了我的 NVIDIA 驱动程序并测试了我可以运行提供的简单 vector 加法程序 here .我可以用下面的 gcc 调用编译这个程序,程序运行没有问题。

gcc main.c -o vectorAddition -l OpenCL -I/usr/local/cuda-6.5/include

但是,我更愿意使用 C++ API 而不是 C 所需的非常冗长的主机文件。

我从 here 下载了 Khronos 的 C++ 绑定(bind)并将 cl.hpp 文件放在与我的其他 cl.h 文件相同的位置。该代码使用了一些 C++11,因此我可以使用以下代码编译代码:

g++ main.cpp -o vectorAddition_cpp -std=c++11 -l OpenCL -I/usr/local/cuda-6.5/include

但是当我尝试运行该程序时出现错误:

clGetPlatformIDs(-1001)

我还尝试了提供的示例 here以及提供更有用的错误消息。

No platforms found. Check OpenCL installation!

提供此错误的特定代码是这样的:

std::vector<cl::Platform> all_platforms;
    cl::Platform::get(&all_platforms);
    if(all_platforms.size()==0){
    std::cout<<" No platforms found. Check OpenCL installation!\n";
    exit(1);
    }

这看起来很奇怪,因为 C 实现可以毫无问题地运行。任何见解将不胜感激。

编辑

C 实现实际上没有正确运行。每次加法都打印为零。检查 ret_num_platforms 也会返回 0。出于某种原因,我的设置无法找到我的 GPU。我错过了什么?我的安装包括分别通过 apt-get.run 文件安装的 nvidia-340 驱动程序和 cuda-6.5。

最佳答案

非常感谢@pasternak 帮助我解决了这个问题。然而,为了解决它,我最终需要避免基本上所有 ubuntu apt-get 调用安装,而只使用 cuda 运行文件进行完整安装。这是解决问题的方法。

  1. 清除现有的 nvidia 和 cuda 实现(sudo apt-get purge cuda* nvidia-*)
  2. CUDA toolkit archive 下载 cuda-6.5 工具包
  3. 重启电脑
  4. 切换到 ttyl (Ctrl-Alt-F1)
  5. 停止 X 服务器(sudo stop lightdm)
  6. 运行cuda运行文件(sh cuda_6.5.14_linux_64.run)
  7. 选择"is"并接受所有默认值
  8. 需要重启
  9. 切换到 ttyl,停止 X 服务器并再次运行 cuda 运行文件并选择"is"并为所有内容选择默认值(再次包括驱动程序)
  10. 更新 PATH 以包含 /usr/local/cuda-6.5/binLD_LIBRARY_PATH 包括 /usr/local/cuda-6.5/lib64
  11. 重新启动
  12. 编译main.c程序(gcc main.c -o vectorAddition -l OpenCL -I/usr/local/cuda-6.5/include)
  13. 验证与 ./vectorAddition 一起工作

C++ API

  1. 从 Khronos 下载 cl.hpp 文件 here注意到它是 1.1 版
  2. 将 cl.hpp 文件与其他 cl header 放在 /usr/local/cuda-6.5/include/CL 中。
  3. 编译main.cpp (g++ main.cpp -o vectorAddition_cpp -std=c++11 -l OpenCL -I/usr/local/cuda-6.5/include)
  4. 验证它是否有效(./vectorAddition_cpp)

两个程序的所有输出都显示了 vector 之间相加的正确输出。

我个人觉得有趣的是,Ubuntu 的 nvidia 驱动程序似乎不能很好地与 cuda 工具包配合使用。可能只适用于旧版本,但仍然非常出乎意料。

关于c++ - OpenCL 找不到平台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29171558/

有关c++ - OpenCL 找不到平台?的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  3. ruby-on-rails - rbenv:从 RVM 移动到 rbenv 后,在 Jenkins 执行 shell 中找不到命令 - 2

    我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions

  4. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  5. ruby-on-rails - 找不到 gem railties (>= 0.a) (Gem::GemNotFoundException) - 2

    我已经看到了一些其他的问题,尝试了他们的建议,但没有一个对我有用。我已经使用Rails大约一年了,刚刚开始一个新的Rails项目,突然遇到了问题。我卸载并尝试重新安装所有Ruby和Rails。Ruby很好,但Rails不行。当我输入railss时,我得到了can'tfindgemrailties。我当前的Ruby版本是ruby2.2.2p95(2015-04-13修订版50295)[x86_64-darwin15],尽管我一直在尝试通过rbenv设置ruby​​2.3.0。如果我尝试rails-v查看我正在运行的版本,我会得到同样的错误。我使用的是MacOSXElCapitan版本10

  6. 即使安装了 gem,Ruby 也找不到所需的库 - 2

    我花了几天时间尝试安装ruby​​1.9.2并让它与gems一起工作:-/我最终放弃了我的MacOSX10.6机器,下面是我的Ubuntu机器上的当前状态。任何建议将不胜感激!#rubytest.rb:29:in`require':nosuchfiletoload--mongo(LoadError)from:29:in`require'fromtest.rb:1:in`'#cattest.rbrequire'mongo'db=Mongo::Connection.new.db("mydb")#gemwhichmongo/usr/local/rvm/gems/ruby-1.9.2-p0/g

  7. ruby - Sinatra 找不到 View 目录 - 2

    我正在尝试以一种更类似于普通RubyGem结构的方式构建我的Sinatra应用程序。我有以下文件树:.├──app.rb├──config.ru├──Gemfile├──Gemfile.lock├──helpers│  ├──dbconfig.rb│  ├──functions.rb│  └──init.rb├──hidden│  └──Rakefile├──lib│  ├──admin.rb│  ├──api.rb│  ├──indexer.rb│  ├──init.rb│  └──magnet.rb├──models│  ├──init.rb│  ├──invite.rb│  ├─

  8. ruby - 在 SUSE 上找不到 Ruby 的头文件? - 2

    我正在尝试在SUSEEnterprise11SP3上安装compass。我得到以下信息。有什么想法吗?geminstallcompassBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingcompass:ERROR:Failedtobuildgemnativeextension./usr/bin/rubyextconf.rbmkmf.rbcan'tfindheaderfilesforrubyat/usr/lib64/ruby/ruby.hextconffailed,exitcode1Gemfileswi

  9. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  10. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

随机推荐