Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用ifort (cuBLAS Fortran绑定)对cublas函数的未定义引用

使用ifort (cuBLAS Fortran绑定)对cublas函数的未定义引用
EN

Stack Overflow用户
提问于 2014-03-25 08:50:11
回答 1查看 1.3K关注 0票数 1

我有一个示例cuBLAS Fortran绑定例程,它是从以前的问题这里中提供的。我正在运行Ubuntu 13.10、IFORT 14.0.1和Cuda 5.5。守则如下:

cublas.f

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      program cublas_fortran_example
      implicit none
      integer i, j

c     helper functions
      integer cublas_init
      integer cublas_shutdown
      integer cublas_alloc
      integer cublas_free
      integer cublas_set_vector
      integer cublas_get_vector
c     selected blas functions
      double precision cublas_ddot
      external cublas_daxpy
      external cublas_dscal
      external cublas_dcopy
      double precision cublas_dnrm2
c     cublas variables
      integer cublas_status
      real*8 x(30), y(30)
      double precision alpha, beta
      double precision nrm
      integer*8 d_x, d_y, d_alpha, d_beta, d_nrm
      integer*8 dsize1, dlength1, dlength2
      double precision dresult



      write(*,*) "testing cublas fortran example"

c     initialize cublas library
c     CUBLAS_STATUS_SUCCESS=0
      cublas_status = cublas_init()
      if (cublas_status /= 0) then
         write(*,*) "CUBLAS Library initialization failed"
         write(*,*) "cublas_status=",cublas_status
         stop
      endif
c     initialize data
      do j=1,30
        x(j) = 1.0
        y(j) = 2.0
      enddo
      dsize1 = 8
      dlength1 = 30
      dlength2 = 1
      alpha = 2.0
      beta = 3.0
c     allocate device storage
      cublas_status = cublas_alloc(dlength1, dsize1, d_x)
      if (cublas_status /= 0) then
         write(*,*) "CUBLAS device malloc failed"
         stop
      endif
      cublas_status = cublas_alloc(dlength1, dsize1, d_y)
      if (cublas_status /= 0) then
         write(*,*) "CUBLAS device malloc failed"
         stop
      endif
      cublas_status = cublas_alloc(dlength2, dsize1, d_alpha)
      if (cublas_status /= 0) then
         write(*,*) "CUBLAS device malloc failed"
         stop
      endif
      cublas_status = cublas_alloc(dlength2, dsize1, d_beta)
      if (cublas_status /= 0) then
         write(*,*) "CUBLAS device malloc failed"
         stop
      endif
      cublas_status = cublas_alloc(dlength2, dsize1, d_nrm)
      if (cublas_status /= 0) then
         write(*,*) "CUBLAS device malloc failed"
         stop
      endif

c     copy data from host to device

      cublas_status = cublas_set_vector(dlength1, dsize1, x, dlength2,
     >     d_x, dlength2)
      if (cublas_status /= 0) then
         write(*,*) "CUBLAS copy to device failed"
         write(*,*) "cublas_status=",cublas_status
         stop
      endif
      cublas_status = cublas_set_vector(dlength1, dsize1, y, dlength2,
     >     d_y, dlength2)
      if (cublas_status /= 0) then
         write(*,*) "CUBLAS copy to device failed"
         write(*,*) "cublas_status=",cublas_status
         stop
      endif

      dresult = cublas_ddot(dlength1, d_x, dlength2, d_y, dlength2)
      write(*,*) "dot product result=",dresult

      dresult = cublas_dnrm2(dlength1, d_x, dlength2)
      write(*,*) "nrm2 of x result=",dresult

      dresult = cublas_dnrm2(dlength1, d_y, dlength2)
      write(*,*) "nrm2 of y result=",dresult

      call cublas_daxpy(dlength1, alpha, d_x, dlength2, d_y, dlength2)
      cublas_status = cublas_get_vector(dlength1, dsize1, d_y, dlength2,
     >     y, dlength2)
      if (cublas_status /= 0) then
         write(*,*) "CUBLAS copy to host failed"
         write(*,*) "cublas_status=",cublas_status
         stop
      endif
      write(*,*) "daxpy y(1)  =", y(1)
      write(*,*) "daxpy y(30) =", y(30)


      call cublas_dscal(dlength1, beta, d_x, dlength2)
      cublas_status = cublas_get_vector(dlength1, dsize1, d_x, dlength2,
     >     x, dlength2)
      if (cublas_status /= 0) then
         write(*,*) "CUBLAS copy to host failed"
         write(*,*) "cublas_status=",cublas_status
         stop
      endif
      write(*,*) "dscal x(1)  =", x(1)
      write(*,*) "dscal x(30) =", x(30)


      call cublas_dcopy(dlength1, d_x, dlength2, d_y, dlength2)
      cublas_status = cublas_get_vector(dlength1, dsize1, d_y, dlength2,
     >     y, dlength2)
      if (cublas_status /= 0) then
         write(*,*) "CUBLAS copy to host failed"
         write(*,*) "cublas_status=",cublas_status
         stop
      endif
      write(*,*) "dcopy y(1)  =", y(1)
      write(*,*) "dcopy y(30) =", y(30)

c     deallocate GPU memory and exit
      cublas_status = cublas_free(d_x)
      cublas_status = cublas_free(d_y)
      cublas_status = cublas_free(d_alpha)
      cublas_status = cublas_free(d_beta)
      cublas_status = cublas_free(d_nrm)
      cublas_status = cublas_shutdown()
      stop
      end

当我使用gfortran编译时,我得到正确的输出,如下所示:

编译并运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$gfortran -c -o cublasf.o cublasf.f
$nvcc -c -DCUBLAS_GFORTRAN -I/usr/local/cuda/include -I/usr/local/cuda/src -o fortran.o /usr/local/cuda/src/fortran.c
$gfortran -o cublasf cublasf.o fortran.o -L/usr/local/cuda/lib64 -lcublas
$ ./cublasf 
 testing cublas fortran example
 dot product result=   60.000000000000000     
 nrm2 of x result=   5.4772255750516612     
 nrm2 of y result=   10.954451150103322     
 daxpy y(1)  =   4.0000000000000000     
 daxpy y(30) =   4.0000000000000000     
 dscal x(1)  =   3.0000000000000000     
 dscal x(30) =   3.0000000000000000     
 dcopy y(1)  =   3.0000000000000000     
 dcopy y(30) =   3.0000000000000000     

然而,我需要在cuBLAS库中使用Intel编译器,但是当我从gfortran切换到ifort时,我会得到各种未定义的引用,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ifort -c -o cublasf.o cublasf.f
$nvcc -c -DCUBLAS_INTEL_FORTRAN -I/usr/local/cuda/include -I/usr/local/cuda/src -o fortran.o /usr/local/cuda/src/fortran.c
$ifort -o cublasf cublasf.o fortran.o -L/usr/local/cuda/lib64 -lcublas
cublasf.o: In function `MAIN__':
cublasf.f:(.text+0x8a): undefined reference to `cublas_init_'
cublasf.f:(.text+0x1f5): undefined reference to `cublas_alloc_'
cublasf.f:(.text+0x21c): undefined reference to `cublas_alloc_'
cublasf.f:(.text+0x243): undefined reference to `cublas_alloc_'
cublasf.f:(.text+0x26a): undefined reference to `cublas_alloc_'
cublasf.f:(.text+0x291): undefined reference to `cublas_alloc_'
cublasf.f:(.text+0x2c8): undefined reference to `cublas_set_vector_'
cublasf.f:(.text+0x3d1): undefined reference to `cublas_set_vector_'
cublasf.f:(.text+0x4d5): undefined reference to `cublas_ddot_'
cublasf.f:(.text+0x56f): undefined reference to `cublas_dnrm2_'
cublasf.f:(.text+0x609): undefined reference to `cublas_dnrm2_'
cublasf.f:(.text+0x6b6): undefined reference to `cublas_daxpy_'
cublasf.f:(.text+0x6e6): undefined reference to `cublas_get_vector_'
cublasf.f:(.text+0x8c5): undefined reference to `cublas_dscal_'
cublasf.f:(.text+0x8f5): undefined reference to `cublas_get_vector_'
cublasf.f:(.text+0xad7): undefined reference to `cublas_dcopy_'
cublasf.f:(.text+0xb07): undefined reference to `cublas_get_vector_'
cublasf.f:(.text+0xcce): undefined reference to `cublas_free_'
cublasf.f:(.text+0xcdd): undefined reference to `cublas_free_'
cublasf.f:(.text+0xcec): undefined reference to `cublas_free_'
cublasf.f:(.text+0xcfb): undefined reference to `cublas_free_'
cublasf.f:(.text+0xd0a): undefined reference to `cublas_free_'
cublasf.f:(.text+0xd11): undefined reference to `cublas_shutdown_'

我看到了一些关于这个问题的其他帖子,但没有真正的解决方案/解释。如果有人能够解释为什么在使用ifort时这些引用是未定义的,而不是在使用gfortran时,以及解决这个问题的任何解决方案,我将非常感激。提前谢谢你!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-25 23:47:51

Intel Fortran文档指出,

在Linux和OS系统上,编译器将下划线字符附加到外部用户定义的名称中.

你需要禁用它

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ifort -assume nounderscore ...

考虑名字案例

这是Linux*和OS *系统上的默认设置。编译器忽略标识符中的大小写差异,并将外部名称转换为小写。

所以你可能也需要

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-names uppercase
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22641241

复制
相关文章
什么是防火墙以及它如何工作?
防火墙是一种通过基于一组用户定义的规则过滤传入和传出网络流量来提供网络安全性的系统。通常,防火墙的目的是减少或消除不需要的网络通信的发生,同时允许所有合法通信自由流动。在大多数服务器基础架构中,防火墙提供了一个重要的安全层,与其他措施相结合,可以防止攻击者以恶意方式访问您的服务器。
新巴子
2018/10/25
5.3K0
什么是路由器,它如何工作?
smarter-home-what-is-router-1-800X300.jpg
用户4122690
2020/03/11
1.4K0
什么是路由器,它如何工作?
产品经理如何帮助减少技术债务 ?
产品经理拥有广泛的知识,能够接触到公司的不同部门和利益相关者。这使得他们处于一个理想的位置,可以围绕预防和应对技术债务创造一种工作文化。我们提供了一些有用的策略。
陈哥聊测试
2021/03/03
4410
如何减少长时间的 GC 停顿?
长时间的 GC 停顿对应用程序是不利的,它会影响服务的 SLA,进而导致糟糕的用户体验,并对核心应用程序的服务造成严重损害。因此,在本文中,我列出了导致长时间 GC 停顿的关键原因以及解决这些问题的可能的解决方案。
涤生
2019/10/08
1.5K0
如何减少长时间的 GC 停顿?
如何减少长时间的 GC 停顿?
长时间的 GC 停顿对应用程序是不利的,它会影响服务的 SLA,进而导致糟糕的用户体验,并对核心应用程序的服务造成严重损害。因此,在本文中,我列出了导致长时间 GC 停顿的关键原因以及解决这些问题的可能的解决方案。
用户1516716
2019/10/08
1.8K0
如何减少长时间的 GC 停顿?
减少网站响应时间概要
概要 减少HTTP请求文件的大小 精简html的DOM元素数量 压缩css,js代码 图片文件选用合适的格式。对于色彩数不是很丰富的图片,使用png格式 压缩图片。使用类似智图的工具 服务器端启用gzip压缩 静态资源放在没有cookie的domain下 减小cookie大小 减小网站标题图标(favicon.ico)的大小 减少HTTP请求数 合并文件。比如将所有的样式表合并成一个,所有脚本文件合并成一个 合并一些图标类图片。图标类图片做成图片精灵(CSS Sprites) 缓存 静态资源的缓存 a
前端GoGoGo
2018/08/27
7500
JVM在执行字节码时是基于栈的执行引擎,了解它的工作机制以及数据结构
当JVM执行字节码时,它使用一种基于栈的执行引擎。这意味着JVM将所有操作数和操作指令存储在一个称为操作数栈的数据结构中。
一凡sir
2023/08/17
2860
JVM在执行字节码时是基于栈的执行引擎,了解它的工作机制以及数据结构
什么是Localhost?以及它如何应用于WordPress?
在计算机网络中,“localhost”是指运行特定程序的计算机。例如,如果您在自己的计算机上运行程序(如Web浏览器或本地Web开发环境),那么您的计算机就是“Localhost”。另一方面,如果您谈论的是位于主机Web服务器上的MySQL数据库,那么您主机的Web服务器就是该场景中的“Localhost”。
Yangsh888
2022/04/05
1.8K0
干货 | 当你在携程搜索时,背后的推荐系统是如何工作的
葛荣亮,携程搜索部门高级研发工程师。2015年加入携程,目前主要负责搜索平台的前端+数据挖据工作。
携程技术
2019/06/11
2.5K0
干货 | 当你在携程搜索时,背后的推荐系统是如何工作的
Flagger 在 Kubernetes 集群上是如何工作的?
通过前面一节的 Flagger基本学习,这节学习它的工作原理,以帮助加深理解应用!
philentso
2022/12/26
2.2K0
RPM索引在Artifactory中是如何工作
RPM是用于保存和管理RPM软件包的仓库。我们在RHEL和Centos系统上常用的Yum安装就是安装的RPM软件包,而Yum的源就是一个RPM软件包的仓库。JFrog Artifactory是成熟的RPM和YUM存储库管理器。JFrog的官方Wiki页面提供有关Artifactory RPM存储库的详细信息。
JFrog杰蛙科技
2020/07/03
2K0
RPM索引在Artifactory中是如何工作
什么是Python中的Dask,它如何帮助你进行数据分析?
Python由于其易用性而成为最流行的语言,它提供了许多库,使程序员能够开发更强大的软件,以并行运行模型和数据转换。
HuangWeiAI
2020/07/27
3K0
什么是Python中的Dask,它如何帮助你进行数据分析?
windows下批处理命令bat是如何工作的?
bat文件是dos下的批处理文件。批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。
叶子陪你玩
2020/03/19
1.6K0
windows下批处理命令bat是如何工作的?
如何查询DNS响应时间
DNS 解析过程涉及将主机名(例如 www.example.com)转换为计算机友好的 IP 地址(例如 192.168.1.1)。Internet 上的每个设备都被分配了一个 IP 地址,必须有该地址才能找到相应的 Internet 设备 - 就像使用街道地址来查找特定住所一样。
冬冬i
2022/04/09
7.9K0
如何查询DNS响应时间
Widget是如何工作的
在前面我们介绍各种各样的Widget,相信大家对Wiget的使用都已经有了自己的认识,今天我们就从底层角度看下Widget是如何工作,是什么支撑起了Wiget这个系统。
flyou
2020/05/28
3.3K0
Goroutine是如何工作的
一、Go语言简介 如果你是Go语言新手,或如果你对"并发(Concurrency)不是并行(parallelism)"这句话毫无赶脚,那么请看一下Rob Pike大神关于这个主题的演讲吧,演讲共30分 钟,我敢保证你在这个演讲上花费30分钟是绝对值得的。 总结一下两者(Concurrency和Parallelism)的不同:"当人们听到并发(Concurrency)这个词时,总是会想起并行 (Parallelism),它们之间有相关性,但却是两个明显不同的概念。在编程领域,并发(Concurrency)是独
李海彬
2018/03/21
2.2K0
HTTPS是如何工作的
大家在浏览网页的时候一定有这样的体验,有一些网站在网址那里会显示一个绿色的挂锁,并且网址中“https”相关的字样也是绿色的,聪明的朋友肯定会问,这些颜色和符号代表什么意思呢?想想大家在上网的时候,经常要输入账号和密码,有时候网购还要输入信用卡信息,如果这些信息被偷了,后果是很严重的。是的,这个绿色的锁就是用来保护大家的信息不被黑客窃取。现在很多网站默认使用HTTPS来保护用户的信息,截止2018年4月,Alexa前100万的网站中,32.2%使用HTTPS作为默认设置,互联网最受欢迎的137971个网站中,57.1%使用了HTTPS;Firefox遥测数据显示,70%的网站使用了HTTPS。
大蟒传奇
2018/07/31
2.4K0
HTTPS是如何工作的
JavaScript是如何工作的?
当将 JavaScript 文件加载到浏览器中时,JavaScript Engine 会从上到下逐行执行该文件(异步代码将是一个例外,我们将在本系列后面的内容中看到异步代码)。
小丑同学
2020/10/30
2.8K0
JavaScript是如何工作的?
Goroutine是如何工作的
在golangweekly的第36期Go Newsletter中我发现一篇短文"How Goroutines Work" ,其作者在参考了诸多资料后,简短概要地总结了一下 Goroutine的工作原理,感觉十分适合刚入门的Gophers(深入理解Goroutine调度的话,可以参考Daniel Morsing的" The Go scheduler" )。这里粗译如下。 一、Go语言简介 如果你是Go语言新手,或如果你对"并发(Concurrency)不是并行(parallelism)"这句话毫无赶脚,那么请
李海彬
2018/03/19
2.3K0
JavaScript 是如何工作的🔥 🤖 [视觉解释]
JavaScript 是世界上最受欢迎和最讨厌的语言之一。它被爱,因为它是有效的。您只需学习 JavaScript 即可制作全栈应用程序。它也被讨厌,因为它以出乎意料和令人不安的方式行事,如果您不投入理解该语言,可能会让您讨厌它💔。 这篇博客将解释 JavaScript 如何在浏览器中执行代码,我们将通过动画 gif 来学习它😆。看完这篇博文,你离成为Rockstar开发者又近了一步🎸😎 执行上下文 “ JavaScript 中的一切都发生在一个执行上下文中。” 我希望每个人都记住这句话,因为它是必不可
玖柒的小窝
2021/09/12
2.6K0
JavaScript 是如何工作的🔥 🤖 [视觉解释]

相似问题

如何使用mysql每天处理数百万条记录

30

如何处理数百万条记录的事件来源

10

MySQL存储过程-处理数百万条记录-如何加速

11

在拥有数百万条记录的SQLite中高效分页

10

处理数百万条记录( ListView或MsFlexGrid )

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文