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