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?