簡體   English   中英

如何使用 acc_set_cuda_stream(streamId, stream)?

[英]How to use acc_set_cuda_stream(streamId, stream)?

我以這種方式創建了 CUDA stream :

integer(kind=cuda_stream_kind) :: stream1
istat = cudaStreamCreate(stream1)

將其用於袖帶的計划:

err_dir = err_dir + cufftPlan2D(plan_dir1,NY,NY,CUFFT_D2Z)
err_dir = err_dir + cufftSetStream(plan_dir1,stream1)

在執行袖帶的例程中,我通過plan_dir1並且我有

subroutine new_fft_dir(z,plan)

  !$acc host_data use_device(z)
  ierr = ierr + cufftExecD2Z(plan,z,z)
  !$acc end host_data

  !$acc parallel loop collapse(2) present(z)
  do i=1,NXP2
  do j=1,NY
  z(i,j) = z(i,j)/NY**2
  enddo
  enddo
  !$acc end parallel loop

我想設置一個 OpenACC stream 等於 CUDA stream stream1 ,但使用:

integer(kind=cuda_stream_kind) :: stream1
istat = cudaStreamCreate(stream1)
integer :: stream
istat = cudaStreamCreate(stream1)
acc_set_cuda_stream(stream,stream1)

我在行尾或行尾附近收到 **NVFORTRAN-S-0034-Syntax 錯誤 (main.f90: 48) **

我的目標是將async子句添加到

  !$acc parallel loop collapse(2) present(z) async(stream)
  do i=1,NXP2
  do j=1,NY
  z(i,j) = z(i,j)/NY**2
  enddo
  enddo
  !$acc end parallel loop

讓這個循環和 fft 在同一個 CUDA stream 上。

問題可能是我使用integer(kind=cuda_stream_kind)cudaStream_t stream嗎?

“acc_set_cuda_stream”是一個子程序,所以你需要在它之前添加“call”。 此外,變量需要在可執行代碼之前聲明,因此“integer::stream”需要向上移動一行。

   use cudafor
   use openacc
   integer(kind=cuda_stream_kind) :: stream1
   integer :: stream
   istat = cudaStreamCreate(stream1)
   call acc_set_cuda_stream(stream,stream1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM