I am trying to create a Fortran based DLL with OpenMP for use in Excel VBA. I am able to successfully create and use the non-OpenMP version. However, as soon as I include the OpenMP directives, and create the DLL, Excel crashes as soon as tries to use the DLL. If I compile the same code as an executable, I see the expected OpenMP behavior and output.
!program main !implicit none !real*8::xx(4,4),yy(4,4) !xx=1.D0 !yy=0.D0 !call myarrtest(xx,yy,4,4) !write(*,*) xx !write(*,*) yy !end program subroutine myarrtest(arrin,arrout,sz1,sz2) use omp_lib !DEC$ ATTRIBUTES DLLEXPORT,STDCALL,REFERENCE,DECORATE,ALIAS:'myarrtest'::myarrtest !DEC$ ATTRIBUTES REFERENCE::arrin,arrout,sz1,sz2 implicit none integer*2::nthreads,tid integer*2::i,j integer*2,intent(in)::sz1,sz2 real*8,intent(in)::arrin(sz1,sz2) real*8,intent(out)::arrout(sz1,sz2) !$omp parallel num_threads(4) private(nthreads, tid) tid = omp_get_thread_num() !if (tid .eq. 0) then !nthreads = omp_get_num_threads() !print *, 'Number of threads = ', nthreads !end if !print *, 'Hello World from thread = ', tid do j=1,sz2 arrout(tid+1,j)=(tid+1)*arrin(tid+1,j) end do !$omp end parallel end subroutine
I compile the above code using the following command
pgfortran -mp -Mmakedll -Bstatic -o myarrtest_openmp.dll myarrtest_openmp.f90
The executable can be compiled by adding/removing appropriate comments. The executable seems to work fine.
The Excel side of VBA call is as follows.
Declare Sub myarrtest Lib "C:\OpenShare\Programming_Stuff\Fortran_Apps\Excel_Fortran_DLL\mytest\myarrtest_openmp.dll" _ (ByRef x As Double, ByRef y As Double, ByRef n1 As Integer, ByRef n2 As Integer) ... Call myarrtest(vbarr(1, 1), fortarr(1, 1), n1, n2) ...
Any ideas of why the OpenMP setup crashes in Excel would be greatly appreciated. On a side note, I was able to successfully achieve this using Intel Fortran. I am hoping to solve this as I would like to eventually move towards a hybrid OpenMP+CUDA Fortran implementation.
Thanks in advance,
- Sam V