BOAST 0.99995 → 0.99996

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 57c36ecbce4158a4dc2fb3a4649fa47805e0c8cc
4
- data.tar.gz: 65cb304450d5eb10c63dbb15c888d24a94d0e566
3
+ metadata.gz: 40c21d4b9f3af7ba3e0a34a8a55b9a7d65329f8f
4
+ data.tar.gz: dd8c7914a2b7918295453dbeffd172a505014cf6
5
5
  SHA512:
6
- metadata.gz: 9ad955b155dd5b59f68026a73c88954a0c353d0ff987160cc7a7bd952808e2ddabae3cd5888c9c957ecb37cae0b1f4922a5007b43cbe64daa53a69d56cd37246
7
- data.tar.gz: ee864516ea19a35b6d39ef49ea01904e5b862c454399918a24d0f19dd4f233e7e0fab06051286e975cf58cc76ea3f1be83d8ae39b71eb31f26f702abb7582dac
6
+ metadata.gz: 2bbe1a51a60e2cd46ceaa611e45d51e294d893c3b2d528fd586fdbd89bdd1ba0b8a0c3189569989a0c2e5a532b16a71e02b3ce5835a44b0b238214d8cf9e4340
7
+ data.tar.gz: f661fa69d0309e6c6b2f294925c08b1c6ddf9f854f745d1b1bb8d1f79d6519d105b8f854eb8514c6f75e96bffbd181ff71ee6fd2028ef1f05f6a8f4bcfc126ce
data/BOAST.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'BOAST'
3
- s.version = "0.99995"
3
+ s.version = "0.99996"
4
4
  s.author = "Brice Videau"
5
5
  s.email = "brice.videau@imag.fr"
6
6
  s.homepage = "https://forge.imag.fr/projects/boast/"
@@ -33,6 +33,7 @@ Gem::Specification.new do |s|
33
33
  lib/BOAST/Print.rb
34
34
  lib/BOAST/State.rb
35
35
  lib/BOAST/Optimization.rb
36
+ lib/BOAST/OpenMP.rb
36
37
  )
37
38
  s.has_rdoc = true
38
39
  s.license = 'BSD'
data/lib/BOAST/For.rb CHANGED
@@ -1,19 +1,28 @@
1
1
  module BOAST
2
2
 
3
3
  class For < ControlStructure
4
+ include OpenMP::Pragma
4
5
 
5
6
  attr_reader :iterator
6
7
  attr_reader :begin
7
8
  attr_reader :end
8
9
  attr_reader :step
9
10
 
10
- def initialize(i, b, e, s=1, &block)
11
+ def initialize(i, b, e, options={}, &block)
12
+ default_options = {:step => 1}
13
+ default_options.update( options )
11
14
  @iterator = i
12
15
  @begin = b
13
16
  @end = e
14
- @step = s
17
+ @step = default_options[:step]
15
18
  @operator = "<="
16
19
  @block = block
20
+ @openmp = default_options[:openmp]
21
+ if @openmp and @openmp.kind_of?(Hash) then
22
+ @openmp_clauses = @openmp
23
+ else
24
+ @openmp_clauses = {}
25
+ end
17
26
  begin
18
27
  push_env( :replace_constants => true )
19
28
  if @step.kind_of?(Variable) then
@@ -33,12 +42,16 @@ module BOAST
33
42
 
34
43
  @@c_strings = {
35
44
  :for => '"for (#{i} = #{b}; #{i} #{o} #{e}; #{i} += #{s}) {"',
36
- :end => '"}"'
45
+ :end => '"}"',
46
+ :openmp_for => '"#pragma omp for #{c}"',
47
+ :openmp_end => '""'
37
48
  }
38
49
 
39
50
  @@f_strings = {
40
51
  :for => '"do #{i} = #{b}, #{e}, #{s}"',
41
- :end => '"end do"'
52
+ :end => '"end do"',
53
+ :openmp_for => '"!$omp do #{c}"',
54
+ :openmp_end => '"!$omp end do #{c}"'
42
55
  }
43
56
 
44
57
  @@strings = {
@@ -50,6 +63,8 @@ module BOAST
50
63
 
51
64
  eval token_string_generator( * %w{for i b e s o})
52
65
  eval token_string_generator( * %w{end})
66
+ eval token_string_generator( * %w{openmp_for c})
67
+ eval token_string_generator( * %w{openmp_end c})
53
68
 
54
69
  def to_s
55
70
  s = for_string(@iterator, @begin, @end, @step, @operator)
@@ -100,6 +115,7 @@ module BOAST
100
115
  end
101
116
 
102
117
  def open
118
+ output.puts openmp_for_string(openmp_clauses_to_s) if @openmp
103
119
  s=""
104
120
  s += indent
105
121
  s += to_s
@@ -123,7 +139,7 @@ module BOAST
123
139
  s += indent
124
140
  s += end_string
125
141
  output.puts s
126
- return self
142
+ output.puts openmp_end_string(openmp_end_clauses_to_s) if @openmp and openmp_end_string(openmp_end_clauses_to_s) != ""
127
143
  end
128
144
 
129
145
  end
@@ -0,0 +1,186 @@
1
+ module BOAST
2
+
3
+ module OpenMP
4
+
5
+ module Pragma
6
+
7
+ def openmp_pragma_to_s
8
+ s = ""
9
+ if lang == FORTRAN then
10
+ s += "!$omp"
11
+ elsif lang == C then
12
+ s += "#pragma omp"
13
+ else
14
+ raise "Language does not support OpenMP!"
15
+ end
16
+ return s
17
+ end
18
+
19
+ def openmp_clauses_to_s
20
+ s = ""
21
+ if @openmp_clauses[:if] then
22
+ s += " if(#{@openmp_clauses[:if]})"
23
+ end
24
+ if @openmp_clauses[:num_threads] then
25
+ s += " num_threads(#{@openmp_clauses[:num_threads]})"
26
+ end
27
+ if @openmp_clauses[:default] then
28
+ s += " default(#{@openmp_clauses[:default]})"
29
+ end
30
+ if @openmp_clauses[:private] then
31
+ s += " private(#{[@openmp_clauses[:private]].flatten.join(", ")})"
32
+ end
33
+ if @openmp_clauses[:firstprivate] then
34
+ s += " firstprivate(#{[@openmp_clauses[:firstprivate]].flatten.join(", ")})"
35
+ end
36
+ if @openmp_clauses[:lastprivate] then
37
+ s += " lastprivate(#{[@openmp_clauses[:lastprivate]].flatten.join(", ")})"
38
+ end
39
+ if lang == C then
40
+ if @openmp_clauses[:copyprivate] then
41
+ s += " copyprivate(#{[@openmp_clauses[:copyprivate]].flatten.join(", ")})"
42
+ end
43
+ if @openmp_clauses[:nowait] then
44
+ s += " nowait"
45
+ end
46
+ end
47
+ if @openmp_clauses[:shared] then
48
+ s += " shared(#{[@openmp_clauses[:shared]].flatten.join(", ")})"
49
+ end
50
+ if @openmp_clauses[:copyin] then
51
+ s += " copyin(#{[@openmp_clauses[:copyin]].flatten.join(", ")})"
52
+ end
53
+ if @openmp_clauses[:reduction] then
54
+ options[:reduction].each { |identifier, list|
55
+ s += " reduction(#{identifier}: #{list.join(", ")})"
56
+ }
57
+ end
58
+ if @openmp_clauses[:schedule] then
59
+ s += " schedule(#{@openmp_clauses[:schedule].join(", ")})"
60
+ end
61
+ if @openmp_clauses[:collapse] then
62
+ s += " collapse(#{@openmp_clauses[:collapse]})"
63
+ end
64
+ if @openmp_clauses[:ordered] then
65
+ s += " ordered"
66
+ end
67
+ return s
68
+ end
69
+
70
+ def openmp_end_clauses_to_s
71
+ s = ""
72
+ if lang == FORTRAN then
73
+ if @openmp_clauses[:copyprivate] then
74
+ s += " copyprivate(#{[@openmp_clauses[:copyprivate]].flatten.join(", ")})"
75
+ end
76
+ if @openmp_clauses[:nowait] then
77
+ s += " nowait"
78
+ end
79
+ end
80
+ return s
81
+ end
82
+
83
+ end
84
+
85
+ module_function
86
+ def functorize(klass)
87
+ name = klass.name.split('::').last
88
+ s = <<EOF
89
+ def #{name}(*args,&block)
90
+ #{name}::new(*args,&block)
91
+ end
92
+
93
+ module_function :#{name}
94
+ EOF
95
+ eval s
96
+ end
97
+
98
+ def var_functorize(klass)
99
+ name = klass.name.split('::').last
100
+ s = <<EOF
101
+ def #{name}(*args,&block)
102
+ Variable::new(args[0],#{name},*args[1..-1], &block)
103
+ end
104
+
105
+ module_function :#{name}
106
+ EOF
107
+ eval s
108
+ end
109
+
110
+ module Functor
111
+
112
+ def self.extended(mod)
113
+ BOAST::OpenMP::functorize(mod)
114
+ end
115
+
116
+ end
117
+
118
+ class ControlStructure
119
+ include PrivateStateAccessor
120
+ include Inspectable
121
+ include OpenMP::Pragma
122
+
123
+ def self.inherited(child)
124
+ child.extend Functor
125
+ end
126
+
127
+ def self.token_string_generator(name, *args)
128
+ s = <<EOF
129
+ def #{name}_string(#{args.join(",")})
130
+ return eval @@strings[get_lang][:#{name}]
131
+ end
132
+ EOF
133
+ end
134
+
135
+ end
136
+
137
+ class Parallel < ControlStructure
138
+
139
+ def initialize(options = {}, &block)
140
+ @openmp_clauses = options
141
+ @block = block
142
+ end
143
+ @@c_strings = {
144
+ :parallel => '"#pragma omp parallel #{c}\n{"',
145
+ :end => '"}"',
146
+ }
147
+
148
+ @@f_strings = {
149
+ :parallel => '"!$omp parallel #{c}"',
150
+ :end => '"!$omp end parallel #{c}"',
151
+ }
152
+
153
+ @@strings = {
154
+ C => @@c_strings,
155
+ FORTRAN => @@f_strings
156
+ }
157
+
158
+ eval token_string_generator( * %w{parallel c})
159
+ eval token_string_generator( * %w{end c})
160
+
161
+ def to_s
162
+ return parallel_string(openmp_clauses_to_s)
163
+ end
164
+
165
+ def open
166
+ output.puts to_s
167
+ end
168
+
169
+ def pr(*args)
170
+ open
171
+ if @block then
172
+ @block.call(*args)
173
+ close
174
+ end
175
+ return self
176
+ end
177
+
178
+ def close
179
+ output.puts end_string(openmp_end_clauses_to_s)
180
+ end
181
+
182
+ end
183
+
184
+ end
185
+
186
+ end
data/lib/BOAST.rb CHANGED
@@ -12,6 +12,7 @@ require 'BOAST/FuncCall.rb'
12
12
  require 'BOAST/Procedure.rb'
13
13
  require 'BOAST/Algorithm.rb'
14
14
  require 'BOAST/ControlStructure.rb'
15
+ require 'BOAST/OpenMP.rb'
15
16
  require 'BOAST/If.rb'
16
17
  require 'BOAST/For.rb'
17
18
  require 'BOAST/Case.rb'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: BOAST
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.99995'
4
+ version: '0.99996'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brice Videau
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-27 00:00:00.000000000 Z
11
+ date: 2014-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: narray
@@ -76,6 +76,7 @@ files:
76
76
  - lib/BOAST/If.rb
77
77
  - lib/BOAST/Index.rb
78
78
  - lib/BOAST/Inspectable.rb
79
+ - lib/BOAST/OpenMP.rb
79
80
  - lib/BOAST/Operators.rb
80
81
  - lib/BOAST/Optimization.rb
81
82
  - lib/BOAST/Parens.rb