problem solved!! now i can use openacc in nim!
    
    
    import strformat
    
    {.emit:"""
    #include "openacc.h"
    """.}
    const num = 10
    
    proc test() =
      let a = cast[ptr[UncheckedArray[float32]]](alloc0(sizeof(float32)*num))
      let b = cast[ptr[UncheckedArray[float32]]](alloc0(sizeof(float32)*num))
      let c = cast[ptr[UncheckedArray[float32]]](alloc0(sizeof(float32)*num))
      
      
      for i in 0 ..< num:
        a[i] = i.float32
        b[i] = (num - i).float32
      
      echo "a[7] = ", $a[7], " | b[7] = ", $b[7]
      echo "before : c[7] = ", $c[7]
      
      const annot =
        "\n#pragma acc data " &
        fmt"copyin(a[:{num}],b[:{num}],c[:{num}]) " &
        "\n#pragma acc kernels"
      {.emit:annot.}
      block:
        for i in `||`(0,num-1, ""):
          for j in `||`(0,num-1,""):
            c[i] += a[i] * b[j]
      
      {.emit:"\n#pragma acc data " & fmt"copyout(c[:{num}])".}
      
      echo "after : c[7] = ", $c[7]
      
      dealloc(a)
      dealloc(b)
      dealloc(c)
    
    when isMainModule:
      test()
    
    
    
    Run

outputs:
    
    
    a[7] = 7.0 | b[7] = 3.0
    before : c[7] = 0.0
    after : c[7] = 385.0
    
    
    Run

Reply via email to