Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 数组大于90个元素时出现分段错误(Fortran绑定,cuBLAS)_Arrays_Cuda_Fortran_Intel Fortran_Cublas - Fatal编程技术网

Arrays 数组大于90个元素时出现分段错误(Fortran绑定,cuBLAS)

Arrays 数组大于90个元素时出现分段错误(Fortran绑定,cuBLAS),arrays,cuda,fortran,intel-fortran,cublas,Arrays,Cuda,Fortran,Intel Fortran,Cublas,我正在用Fortran编写一个简单的矩阵向量乘法程序。在这个程序中,我使用了库布拉斯的Fortran绑定例程。当我的数组包含少于90个元素时,该程序就像一个魔咒。我读过其他几篇文章,建议使用ulimit-s unlimited或-heap array[size],但在我的情况下这些都不起作用。有没有其他我不知道的解决这个问题的方法?我正在使用ifort和gfortran编译,使用nvcc编译cublas例程 ifort $ifort-heap arrays 1-names大写-假定nounder

我正在用Fortran编写一个简单的矩阵向量乘法程序。在这个程序中,我使用了库布拉斯的Fortran绑定例程。当我的数组包含少于90个元素时,该程序就像一个魔咒。我读过其他几篇文章,建议使用
ulimit-s unlimited
-heap array[size]
,但在我的情况下这些都不起作用。有没有其他我不知道的解决这个问题的方法?我正在使用ifort和gfortran编译,使用nvcc编译cublas例程

ifort

$ifort-heap arrays 1-names大写-假定nounderscore-c-o cublasf.o main.f90
$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-heap array 1-o cublasf fortran.o cublasf.o-L/usr/local/cuda/lib64-lcublas

gfortran

$gfortran-c-o cublasf.o main.f90
$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

如蒙协助,将不胜感激。提前谢谢

更新 下面是我正在尝试运行的代码。我知道这不是最漂亮的代码,我可以做一些优化,但目前它只是用于测试。有一些被注释掉的元素只用于测试目的(不需要担心这些)

main.f90

program main

implicit none

INTEGER CUBLAS_INIT
INTEGER CUBLAS_ALLOC
INTEGER CUBLAS_FREE
INTEGER CUBLAS_SET_VECTOR
INTEGER CUBLAS_SET_MATRIX
INTEGER CUBLAS_GET_VECTOR
INTEGER CUBLAS_SGEMV
EXTERNAL CUBLAS_SGEMV
INTEGER CUBLAS_SHUTDOWN

integer :: countNumCuda, countNumCuda2,countNumFort,countNumFort2
integer :: clockRate = 4
integer*4, parameter :: N=80
real*4, dimension(N,N) :: mat
real*8 :: devPtr_mat, devPtr_vect, devPtr_outVect
real*4, dimension(N) :: vect,outVect,outVect2, anotherVect
integer :: i,j
integer :: size_of_real = 8
character :: trans = "N"
real*4 :: alpha = 1.0
real*4 :: beta = 0.0
integer :: cublas_status

! Initialize matrix and array 
do i = 1, N
  do j = 1, N
    mat(i,j) = i
  end do
  vect(i) = i
  outVect(i) = 0
  outVect2(i) = 0
end do

!call SYSTEM_CLOCK(countNumFort, clockRate)
!call MATRIXVECTORMULT(mat, vect, outVect, N)
!call SYSTEM_CLOCK(countNumFort2, clockRate)

!do i = 1, N
!  anotherVect(i) = outVect(i)
!enddo

call SYSTEM_CLOCK(countNumCuda, clockRate)
print*,"Entering GPU"
cublas_status = CUBLAS_INIT()
if (cublas_status .NE. 0) then
  print *, "initialization error"
end if

cublas_status = CUBLAS_ALLOC(N*N,size_of_real, devPtr_mat)
if (cublas_status .NE. 0) then
  print *, "Allocation error devMat"
end if

cublas_status = CUBLAS_ALLOC(N, size_of_real, devPtr_vect)
if (cublas_status .NE. 0) then
  print *, "Allcoation error devVect"
end if

cublas_status = CUBLAS_ALLOC(N, size_of_real, devPtr_outVect)
if (cublas_status .NE. 0) then
  print *, "Allocation error devPtrOut"
end if

cublas_status = CUBLAS_SET_VECTOR(N, size_of_real, vect, 1, devPtr_vect, 1)
if (cublas_status .NE. 0) then
  print *, "Set vector error", cublas_status
end if

cublas_status = CUBLAS_SET_MATRIX(N,N,size_of_real, mat, N, devPtr_mat, N)
if (cublas_status .NE. 0) then
  print *, "Set matrix error", cublas_status
end if

cublas_status = CUBLAS_SGEMV(trans,N,N,alpha, devPtr_mat, N, devPtr_vect,1,beta,devPtr_outVect,1)
if (cublas_status .NE. 0) then
  print *, "SGEMV error", cublas_status
end if

cublas_status = CUBLAS_GET_VECTOR(N,size_of_real, devPtr_outVect, 1, outVect2, 1)
if (cublas_status .NE. 0) then
  print *, "Get vector error", cublas_status
end if

cublas_status = CUBLAS_FREE(devPtr_mat)
if (cublas_status .NE. 0) then
  print *, "free mat error", cublas_status
end if

cublas_status = CUBLAS_FREE(devPtr_vect)
if (cublas_status .NE. 0) then
  print *, "free vect error", cublas_status
end if

cublas_status = CUBLAS_FREE(devPtr_outVect)
if (cublas_status .NE. 0) then
  print *, "Free outVect error", cublas_status
end if

cublas_status = CUBLAS_SHUTDOWN()
if (cublas_status .NE. 0) then
  print *, "shutdown error", cublas_status
end if

call SYSTEM_CLOCK(countNumCuda2, clockRate)

!Results from CUDA
!do i = 1, N
! print *, anotherVect(i), outVect(i), outVect2(i)
!end do

do i = 1, N
  print*, outVect2(i)
enddo

!print *, countNumCuda2 - countNumCuda, "Cuda Rate"
!print *, countNumFort2 - countNumFort, "Fortran Rate"

end program main

再次感谢

分段错误是由主机代码或访问驻留在主机上的变量引起的。当您在此处请求有关seg故障的帮助时,最好确定产生seg故障的实际代码行或短代码段。用这样的短代码来实现这一点很简单,只需将print语句自由地放在代码中,看看哪些发生了,哪些没有发生

seg故障是由于您将大部分基于主机的存储分配为4字节real:

real*4, dimension(N,N) :: mat
...
real*4, dimension(N) :: vect,outVect,outVect2, anotherVect
但当您试图将它们复制到设备时,您是在指示cublas假定每个元素都是8字节的数量:

integer :: size_of_real = 8
对我来说,seg故障发生在这一行代码上:

cublas_status = CUBLAS_SET_MATRIX(N,N,size_of_real, mat, N, devPtr_mat, N)
该行指示
cublas
将变量
mat
复制到设备。但您要求它复制N*N*8字节,这是您分配的两倍大。当复制例程超出
mat
的分配结束时,会发生seg故障(最终)

将声明更改为每实8字节:

real*8, dimension(N,N) :: mat
...
real*8, dimension(N) :: vect,outVect,outVect2, anotherVect

为我消除了seg故障。

分段故障是由主机代码或访问驻留在主机上的变量引起的。当您在此处请求有关seg故障的帮助时,最好确定产生seg故障的实际代码行或短代码段。用这样的短代码来实现这一点很简单,只需将print语句自由地放在代码中,看看哪些发生了,哪些没有发生

seg故障是由于您将大部分基于主机的存储分配为4字节real:

real*4, dimension(N,N) :: mat
...
real*4, dimension(N) :: vect,outVect,outVect2, anotherVect
但当您试图将它们复制到设备时,您是在指示cublas假定每个元素都是8字节的数量:

integer :: size_of_real = 8
对我来说,seg故障发生在这一行代码上:

cublas_status = CUBLAS_SET_MATRIX(N,N,size_of_real, mat, N, devPtr_mat, N)
该行指示
cublas
将变量
mat
复制到设备。但您要求它复制N*N*8字节,这是您分配的两倍大。当复制例程超出
mat
的分配结束时,会发生seg故障(最终)

将声明更改为每实8字节:

real*8, dimension(N,N) :: mat
...
real*8, dimension(N) :: vect,outVect,outVect2, anotherVect

为我消除了seg故障。

分段故障是由主机代码或访问驻留在主机上的变量引起的。当您在此处请求有关seg故障的帮助时,最好确定产生seg故障的实际代码行或短代码段。用这样的短代码来实现这一点很简单,只需将print语句自由地放在代码中,看看哪些发生了,哪些没有发生

seg故障是由于您将大部分基于主机的存储分配为4字节real:

real*4, dimension(N,N) :: mat
...
real*4, dimension(N) :: vect,outVect,outVect2, anotherVect
但当您试图将它们复制到设备时,您是在指示cublas假定每个元素都是8字节的数量:

integer :: size_of_real = 8
对我来说,seg故障发生在这一行代码上:

cublas_status = CUBLAS_SET_MATRIX(N,N,size_of_real, mat, N, devPtr_mat, N)
该行指示
cublas
将变量
mat
复制到设备。但您要求它复制N*N*8字节,这是您分配的两倍大。当复制例程超出
mat
的分配结束时,会发生seg故障(最终)

将声明更改为每实8字节:

real*8, dimension(N,N) :: mat
...
real*8, dimension(N) :: vect,outVect,outVect2, anotherVect

为我消除了seg故障。

分段故障是由主机代码或访问驻留在主机上的变量引起的。当您在此处请求有关seg故障的帮助时,最好确定产生seg故障的实际代码行或短代码段。用这样的短代码来实现这一点很简单,只需将print语句自由地放在代码中,看看哪些发生了,哪些没有发生

seg故障是由于您将大部分基于主机的存储分配为4字节real:

real*4, dimension(N,N) :: mat
...
real*4, dimension(N) :: vect,outVect,outVect2, anotherVect
但当您试图将它们复制到设备时,您是在指示cublas假定每个元素都是8字节的数量:

integer :: size_of_real = 8
对我来说,seg故障发生在这一行代码上:

cublas_status = CUBLAS_SET_MATRIX(N,N,size_of_real, mat, N, devPtr_mat, N)
该行指示
cublas
将变量
mat
复制到设备。但是你要求它复制N*N*8字节,这是a的两倍大