【问题标题】:OpenACC with DGEMM call error in gfortran在 gfortran 中带有 DGEMM 调用错误的 OpenACC
【发布时间】:2017-01-07 20:37:00
【问题描述】:

gfortran 现在支持 host_data,所以我想测试 DGEMM。基于此处发布的测试用例

host_data patch

我使用 cuBLAS 为 DGEMM 编写了示例代码。

program test

  use iso_c_binding

  implicit none

  integer(c_int), parameter :: N = 10
  integer(c_int) :: i, j
  real(c_double) :: x(N, N), y(N, N), z(N, N)
  character(kind=c_char)     :: flag

  interface
     subroutine cublasdgemm(transa, transb, m, n, k, alpha, A, lda, B, &
             ldb, beta, C, ldc) bind(c, name="cublasDgemm")
       use iso_c_binding
       character(kind=c_char)     :: transa, transb
       integer(kind=c_int), value :: m, n, k
       real(c_double), value      :: alpha
       type(*), dimension(*)      :: A
       integer(kind=c_int), value :: lda
       type(*), dimension(*)      :: B
       integer(kind=c_int), value :: ldb
       real(c_double), value      :: beta
       type(*), dimension(*)      :: C
       integer(kind=c_int), value :: ldc

     end subroutine cublasdgemm

  end interface

  do i = 1, N
     do j = 1, N
       x(i, j) = 4.0 * i
       y(i, j) = 3.0 + j
       z(i, j) = 0.0
     end do
  end do

  flag = 'N'

  !$acc data copyin (x, y) copy (z)

  !$acc host_data use_device (x, y, z)
  call cublasdgemm(flag, flag, n, n, n, 1.0_c_double, x, n, y, n, 0.0_c_double, z, n)
  !$acc end host_data

  !$acc end data

  call dgemm(flag, flag, n, n, n, 1.0_c_double, x, n, y, n, 0.0_c_double, z, n)

  write(*, *) z

end program test

不幸的是,我收到了这个错误。

** On entry to DGEMM  parameter number 1 had an illegal value

在我看来,字符数据类型有些不匹配。但我无法弄清楚。我把具有相同变量的 DGEMM 调用放在最后,它运行良好。

感谢您的帮助。

编译:

要编译它,我使用根据此链接上的说明编译的 gfortran 6.2

gfortran with nvptx

然后我从

复制
/usr/local/cuda/src/

文件

fortran_common.h
fortran.h
fortran.c

然后做

gcc -Wall -g -I/usr/local/cuda/include -I/usr/local/cuda/src -DCUBLAS_GFORTRAN -c fortran.c

获取 cuBLAS 接口的 fortran.o 文件。

那我做

gfortran -Wall -g test.f90 fortran.o -fopenacc -foffload=nvptx-none -foffload=-O3 -O3 -o gpu.x -L/usr/local/cuda/lib64 -lcublas -lcudart -lblas

这是我用来成功运行第一个链接中的 saxpy 示例的过程。

【问题讨论】:

  • 根据文档herecublasdgemm 的第一个参数应该是某种句柄,而不是标准的dgemm 转置选项。换句话说,cublasdgemm 没有与dgemm 相同的接口。当然,如果saxpy 版本有效,那么情况可能并非如此。
  • 谢谢。我之前没见过。另一方面,fortran.c 文件具有 cublasDgemm (transa[0], transb[0], *m, *n, *k, *alpha, A, *lda, B, *ldb, *beta, C, * ldc) 这是我假设我们正在连接的功能。此外,正如您所指出的,saxpy 示例运行良好。

标签: fortran gfortran cublas openacc


【解决方案1】:

原来答案相当简单。我必须在字符变量的定义中添加“值”。

    subroutine cublasdgemm(transa, transb, m, n, k, alpha, A, lda, B, &
             ldb, beta, C, ldc) bind(c, name="cublasDgemm")
       use iso_c_binding
       character(kind=c_char), value     :: transa, transb
       integer(kind=c_int), value :: m, n, k
       real(c_double), value      :: alpha
       type(*), dimension(*)      :: A
       integer(kind=c_int), value :: lda
       type(*), dimension(*)      :: B
       integer(kind=c_int), value :: ldb
       real(c_double), value      :: beta
       type(*), dimension(*)      :: C
       integer(kind=c_int), value :: ldc

     end subroutine cublasdgemm

【讨论】:

    猜你喜欢
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多