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?