-
Notifications
You must be signed in to change notification settings - Fork 6
/
omp.nim
57 lines (53 loc) · 1.89 KB
/
omp.nim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import os
when defined(noOpenmp):
template omp_set_num_threads*(x: cint) = discard
template omp_get_num_threads*(): cint = 1
template omp_get_max_threads*(): cint = 1
template omp_get_thread_num*(): cint = 0
template ompPragma(p:string):untyped = discard
else:
when existsEnv("OMPFLAG"):
const ompFlag = getEnv("OMPFLAG")
else:
const ompFlag = "-fopenmp"
{. passC: ompFlag .}
{. passL: ompFlag .}
{. pragma: omp, header:"omp.h" .}
proc omp_set_num_threads*(x: cint) {.omp.}
proc omp_get_num_threads*(): cint {.omp.}
proc omp_get_max_threads*(): cint {.omp.}
proc omp_get_thread_num*(): cint {.omp.}
#proc forceOmpOn() {.omp.}
template ompPragma(p:string):untyped =
#forceOmpOn()
{. emit:"#pragma omp " & p .}
template ompBarrier* = ompPragma("barrier")
template ompBlock(p:string; body:untyped):untyped =
ompPragma(p)
block:
body
template ompParallel*(body:untyped):untyped =
ompBlock("parallel"):
if(omp_get_thread_num()!=0):
setupForeignThreadGc()
body
template ompMaster*(body:untyped):untyped = ompBlock("master", body)
template ompSingle*(body:untyped):untyped = ompBlock("single", body)
template ompCritical*(body:untyped):untyped = ompBlock("critical", body)
when isMainModule:
proc test =
echo "main: ", ompGetThreadNum(), "/", ompGetNumThreads()
ompParallel:
echo "parallel: ", ompGetThreadNum(), "/", ompGetNumThreads()
ompBarrier()
ompMaster:
echo "master: ", ompGetThreadNum(), "/", ompGetNumThreads()
echo "parallel: ", ompGetThreadNum(), "/", ompGetNumThreads()
ompSingle:
echo "single: ", ompGetThreadNum(), "/", ompGetNumThreads()
echo "parallel: ", ompGetThreadNum(), "/", ompGetNumThreads()
ompCritical:
echo "critical: ", ompGetThreadNum(), "/", ompGetNumThreads()
echo "parallel: ", ompGetThreadNum(), "/", ompGetNumThreads()
ompBarrier()
test()