import strformat
    
    {.emit:"""
    #include "openacc.h"
    """.}
    
    const num = 512
    
    type
      DataSeq = ref object
        x, y, z: seq[cdouble]
      
      Data[N:static[int]] = object
        x, y, z: ref array[N, cdouble]
    
    proc newDataSeq(N: static[int], T:typedesc): DataSeq =
      result = DataSeq(
        x:newSeq[T](N),
        y:newSeq[T](N),
        z:newSeq[T](N)
      )
    
    proc toStatic(m: DataSeq, N: static[int]): Data[N] =
      new result.x
      new result.y
      new result.z
      for i in 0..<N:
        result.x[i] = m.x[i]
        result.y[i] = m.y[i]
        result.z[i] = m.z[i]
    
    proc newData(N: static[int], T:typedesc): Data[N] =
      var dataseq = newDataSeq(N, T)
      result = dataseq.toStatic(N)
    
    proc test[N](d: Data[N]): array[N,array[N, cdouble]] =
      {.push boundChecks : off.}
      var
        a = d.x[]
        b = d.y[]
        c = d.z[]
        m = result
      
      for i in 0 ..< num:
        a[i] = i.cdouble
        b[i] = (num - i).cdouble
      
      echo "a[7] = ", $a[7], " | b[7] = ", $b[7], " | c[7] = ", $c[7]
      echo "before : m[7][7] = ", $m[7][7]
      
      const annot =
        "\n#pragma acc data " &
        fmt"copyin(a[:{num}],b[:{num}],c[:{num}],m[:{num}][:{num}]) " &
        "\n#pragma acc kernels"
      {.emit:annot.}
      block:
        for jj in `||`(0,num-1,""):
          c[jj] = jj.cdouble
        
        for i in `||`(0,num-1, ""):
          for j in `||`(0,num-1,""):
            m[i][j] = a[i] * b[j] + c[j]
      
      {.emit:"\n#pragma acc data " & fmt"copyout(m[:{num}][:{num}],c[:{num}])".}
      
      echo "after : m[7][7] = ", $m[7][7], " | c[7] = ", $c[7]
      result = m
      {.pop.}
    
    when isMainModule:
      var d = newData(num, cdouble)
      var m = test(d)
      echo "m[7][7] = ", $m[7][7]
    
    
    Run

i tried using object contain array set. some tips for use and create object 
contain multiple array?

Reply via email to