2017-06-29 189 views
0

我目前正在將一些Fortran代碼遷移到cudaFortran。具體來說,該任務涉及對大量矩陣進行頻譜分析以便對它們進行對角化。下面是我到目前爲止fabricobbled代碼正確使用cudaFortran cuSolver函數

program main 
!Trials for usage of cusovlerDn<t>syevd for spectral analysis of a symmetric matrix, see http://docs.nvidia.com/cuda/cusolver/index.html#syevd-example1 for the example used as a base 
!Compilation example: 'pgf90 Main.cuf -lcusolver -Mcuda=cuda8.0' 
use cudafor !has to go first 
use cusolverDn 
    implicit none 
integer :: info 
    integer,parameter :: q2 = SELECTED_REAL_KIND(15,305) 
    real(q2), device, dimension(3,3) :: A_d 
    real(q2), dimension(3,3) :: A 
    real(q2), device, dimension(3) :: W_d 
    real(q2), dimension(3) :: W 
    integer :: stat, lwork, m, lda 
    real(q2), device, allocatable :: work_d(:) 
    integer, device :: devInfo 
    type(cusolverDnHandle) :: h 
    stat=cusolverDnCreate(h) 
     W_d=(/0,0,0/) 
print *, stat 
    m=3 
    lda = m 
    A_d(1,1:3)=(/4,1,2/) 
    A_d(2,1:3)=(/1,-1,1/) 
    A_d(3,1:3)=(/2,1,3/) !eigenvalues are 5.84947, 1.44865, -1.29812 
! A_d(1,1:3)=(/1,0,0/) 
! A_d(2,1:3)=(/0,1,0/) 
! A_d(3,1:3)=(/0,0,1/) 
    stat=cusolverDnDsyevd_bufferSize(h, CUSOLVER_EIG_MODE_NOVECTOR, CUBLAS_FILL_MODE_UPPER, m, A_d, lda, W_d, lwork) 
print *, stat 
    allocate(work_d(lwork)) 
    stat=cusolverDnDsyevd(h, CUSOLVER_EIG_MODE_NOVECTOR, CUBLAS_FILL_MODE_UPPER, m, A_d, lda, W_d, work_d, lwork, devInfo) 
print *, stat !returns 6 as if there was an error 
info=devInfo 
print *, info !devInfo returns 0, as if the operation was successful 
    stat=cudaDeviceSynchronize() 
print *, stat 
    W=W_d 
    print *, W 
    A=A_d 
    print *, A 
    deallocate(work_d) 
    stat=cusolverDnDestroy(h) 
print *, stat 
end program main 

編制和MEM-檢查產量如下:

[email protected]:~/Skyrmions2017/Project$ pgf90 Main.cuf -lcusolver -Mcuda=cuda8.0 
[email protected]:~/Skyrmions2017/Project$ cuda-memcheck ./a.out 
========= CUDA-MEMCHECK 
      0 
      0 
========= Program hit cudaErrorInvalidDeviceFunction (error 8) due to "invalid device function" on CUDA API call to cudaLaunch. 
=========  Saved host backtrace up to driver entry point at error 
=========  Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so.1 [0x2ef503] 
=========  Host Frame:/opt/pgi/linux86-64/2017/cuda/8.0/lib64/libcusolver.so.8.0 [0x5b906e] 
=========  Host Frame:/opt/pgi/linux86-64/2017/cuda/8.0/lib64/libcusolver.so.8.0 [0x2e0857] 
=========  Host Frame:/opt/pgi/linux86-64/2017/cuda/8.0/lib64/libcusolver.so.8.0 [0x2e0270] 
=========  Host Frame:/opt/pgi/linux86-64/2017/cuda/8.0/lib64/libcusolver.so.8.0 [0x2e3df3] 
=========  Host Frame:/opt/pgi/linux86-64/2017/cuda/8.0/lib64/libcusolver.so.8.0 [0x2e1720] 
=========  Host Frame:/opt/pgi/linux86-64/2017/cuda/8.0/lib64/libcusolver.so.8.0 [0x2e0157] 
=========  Host Frame:/opt/pgi/linux86-64/2017/cuda/8.0/lib64/libcusolver.so.8.0 (cusolverDnDsytrd + 0x37) [0x2e3f17] 
=========  Host Frame:/opt/pgi/linux86-64/2017/cuda/8.0/lib64/libcusolver.so.8.0 [0x2ea607] 
=========  Host Frame:/opt/pgi/linux86-64/2017/cuda/8.0/lib64/libcusolver.so.8.0 [0x2eb744] 
=========  Host Frame:/opt/pgi/linux86-64/2017/cuda/8.0/lib64/libcusolver.so.8.0 (cusolverDnDsyevd + 0x27) [0x2ea157] 
=========  Host Frame:./a.out [0x1b2d] 
=========  Host Frame:./a.out [0x1514] 
=========  Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xf0) [0x20830] 
=========  Host Frame:./a.out [0x13f9] 
========= 
      6 
========= Program hit cudaErrorInvalidDeviceFunction (error 8) due to "invalid device function" on CUDA API call to cudaGetLastError. 
=========  Saved host backtrace up to driver entry point at error 
=========  Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so.1 [0x2ef503] 
=========  Host Frame:/opt/pgi/linux86-64/2017/cuda/8.0/lib64/libcusolver.so.8.0 [0x5b6793] 
=========  Host Frame:/opt/pgi/linux86-64/2017/cuda/8.0/lib64/libcusolver.so.8.0 [0x2e1727] 
=========  Host Frame:/opt/pgi/linux86-64/2017/cuda/8.0/lib64/libcusolver.so.8.0 [0x2e0157] 
=========  Host Frame:/opt/pgi/linux86-64/2017/cuda/8.0/lib64/libcusolver.so.8.0 (cusolverDnDsytrd + 0x37) [0x2e3f17] 
      0 
=========  Host Frame:/opt/pgi/linux86-64/2017/cuda/8.0/lib64/libcusolver.so.8.0 [0x2ea607] 
=========  Host Frame:/opt/pgi/linux86-64/2017/cuda/8.0/lib64/libcusolver.so.8.0 [0x2eb744] 
=========  Host Frame:/opt/pgi/linux86-64/2017/cuda/8.0/lib64/libcusolver.so.8.0 (cusolverDnDsyevd + 0x27) [0x2ea157] 
=========  Host Frame:./a.out [0x1b2d] 
      0 
=========  Host Frame:./a.out [0x1514] 
=========  Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xf0) [0x20830] 
=========  Host Frame:./a.out [0x13f9] 
========= 
    0.000000000000000   0.000000000000000   0.000000000000000  
    4.000000000000000   1.000000000000000   2.000000000000000  
    1.000000000000000  -1.000000000000000   1.000000000000000  
    2.000000000000000   1.000000000000000   3.000000000000000  
      0 
========= ERROR SUMMARY: 2 errors 

它看起來像我不是真正調用cusolverDnDsyevd功能正常,最有可能的我我沒有使用正確類型的變量。但是由於我在編程中半文盲,我必須遵循的唯一例子是用C編寫的(使用那些奇怪的void **事物),我不知道什麼是合適的。

編輯:的deviceQuery

[email protected]:~/NVIDIA_CUDA-8.0_Samples/1_Utilities/deviceQuery$ ./deviceQuery 
./deviceQuery Starting... 

CUDA Device Query (Runtime API) version (CUDART static linking) 

Detected 1 CUDA Capable device(s) 

Device 0: "GeForce 940MX" 
    CUDA Driver Version/Runtime Version   8.0/8.0 
    CUDA Capability Major/Minor version number: 5.0 
    Total amount of global memory:     2002 MBytes (2099642368 bytes) 
    (3) Multiprocessors, (128) CUDA Cores/MP:  384 CUDA Cores 
    GPU Max Clock rate:       1242 MHz (1.24 GHz) 
    Memory Clock rate:        900 Mhz 
    Memory Bus Width:        64-bit 
    L2 Cache Size:         1048576 bytes 
    Maximum Texture Dimension Size (x,y,z)   1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096) 
    Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layers 
    Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 16384), 2048 layers 
    Total amount of constant memory:    65536 bytes 
    Total amount of shared memory per block:  49152 bytes 
    Total number of registers available per block: 65536 
    Warp size:          32 
    Maximum number of threads per multiprocessor: 2048 
    Maximum number of threads per block:   1024 
    Max dimension size of a thread block (x,y,z): (1024, 1024, 64) 
    Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535) 
    Maximum memory pitch:       2147483647 bytes 
    Texture alignment:        512 bytes 
    Concurrent copy and kernel execution:   Yes with 1 copy engine(s) 
    Run time limit on kernels:      Yes 
    Integrated GPU sharing Host Memory:   No 
    Support host page-locked memory mapping:  Yes 
    Alignment requirement for Surfaces:   Yes 
    Device has ECC support:      Disabled 
    Device supports Unified Addressing (UVA):  Yes 
    Device PCI Domain ID/Bus ID/location ID: 0/1/0 
    Compute Mode: 
    < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) > 

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GeForce 940MX 
Result = PASS 
+0

這些開關:'-lcusolver -Mcuda = cuda8.0 -ms_50'不屬於'cuda-memcheck'命令,但我不相信它們會傷害任何東西。您試圖在哪些GPU上運行此代碼? –

+0

@RobertCrovella是的,得到的選項和開關混合起來,沒有開關輸出是相同的。另外,ms-50只是簡單的hogwash,我相應地改變了這個問題。我在筆記本電腦的Geforce940MX上運行這個程序,但是希望稍後能夠在一臺好的Tesla K80上運行它。我已經成功運行了各種基本的東西,cuBLAS以及在CPU和GPU之間移動內存,所以我認爲它已經正確設置。 –

+2

當我使用Linux上的PGI 17.5工具編譯代碼並運行Tesla P100時,我得到正確的輸出,並且沒有'cuda-memcheck'報告的錯誤。以下是報告的3個特徵值:'-1.298117179004938 1.448645604364364 5.849471574640574'筆記本上的CUDA設置可能存在問題。在筆記本上運行時'deviceQuery'報告的計算能力是什麼? –

回答

0

全面輸出由於代碼工作正常,在另一個系統上在我手上這個問題確實是一個運行時環境問題,由羅伯特·Crovella

這個故事的寓意的建議:總是嘗試至少2個系統。