Merge pull request #2875 from github/2821-slim

Add Terra support
This commit is contained in:
Arfon Smith
2016-03-17 10:40:19 -06:00
7 changed files with 355 additions and 0 deletions

3
.gitmodules vendored
View File

@@ -716,3 +716,6 @@
[submodule "vendor/grammars/language-povray"]
path = vendor/grammars/language-povray
url = https://github.com/c-lipka/language-povray
[submodule "vendor/grammars/sublime-terra"]
path = vendor/grammars/sublime-terra
url = https://github.com/pyk/sublime-terra

View File

@@ -549,6 +549,8 @@ vendor/grammars/sublime-spintools/:
- source.spin
vendor/grammars/sublime-tea:
- source.tea
vendor/grammars/sublime-terra:
- source.terra
vendor/grammars/sublime-text-ox/:
- source.ox
vendor/grammars/sublime-text-pig-latin/:

View File

@@ -3565,6 +3565,16 @@ Tea:
tm_scope: source.tea
ace_mode: text
Terra:
type: programming
extensions:
- .t
color: "#00004c"
ace_mode: lua
group: Lua
interpreters:
- lua
Text:
type: prose
wrap: true

114
samples/Terra/arith.t Normal file
View File

@@ -0,0 +1,114 @@
--[[
-
+
*
/
%
^
and
or
~= == < > >= <=
<< >>
]]
terra test0()
var a = 1 + 3
var b = 1LL + 2LL
var c = 1ULL + 2ULL
var d = 1.f + 2.f
var e = 1.0 + 2.0
return a + b + c + d + e
end
terra test1()
var a = 1 - 3
var b = 1LL - 2LL
var c = 1ULL - 2ULL
var d = 1.f - 2.f
var e = 1.0 - 2.0
return a - b - c - d - e
end
terra test2()
var a = 2 * 3
var b = 3LL * 2LL
var c = 3ULL * 2ULL
var d = 1.f * 2.f
var e = 3.0 * 2.0
return a * b * c * d * e
end
terra test3()
var a = 2 / 3 + 1
var b = 3LL / 2LL + 1
var c = 3ULL / 2ULL
var d = 1.f / 2.f
var e = 3.0 / 2.0
return a * b * c * d * e
end
terra test4()
var a = 2 % 3
var b = 3LL % 4LL
var c = 3ULL % 2ULL
var d = 1.f % 2.f
var e = 3.75 % 2.0
return (a == 2) and (b == 3LL) and (d == 1.f) and (e == 1.75)
end
terra test5()
var a = 2 ^ 3
var b = 3LL ^ 4LL
var c = 3ULL ^ 2ULL
return (a == 1) and (b == 7LL) and (c == 1ULL)
end
terra test6()
var a = 2 and 3
var b = 3LL and 4LL
var c = 3ULL and 2ULL
return (a == 2) and (b == 0LL) and (c == 2ULL)
end
terra test7()
var a = 2 or 3
var b = 3LL or 4LL
var c = 3ULL or 2ULL
return (a == 3) and (b == 7LL) and (c == 3ULL)
end
terra test8()
var a0,a1 = 2 ~= 3, 2 == 3
var b0,b1 = 2 < 3, 2 >= 3
var c0,c1 = 2 > 3, 2 <= 3
return a0 and not a1 and b0 and not b1 and not c0 and c1
end
terra test9()
var a0, a1 = 8 >> 1, 8 << 1
var b0, b1 = -8 >> 1, -8 << 1
return a0 == 4 and a1 == 16 and b0 == -4 and b1 == -16
end
local test = require("test")
test.eq(test0(),16)
test.eq(test1(),2)
test.eq(test2(),2592)
test.eq(test3(),1.5)
test.eq(test4(),true)
test.eq(test5(),true)
test.eq(test6(),true)
test.eq(test7(),true)
test.eq(test8(),true)
test.eq(test9(),true)

75
samples/Terra/arrayt.t Normal file
View File

@@ -0,0 +1,75 @@
C = terralib.includecstring [[
#include <stdio.h>
#include <stdlib.h>
]]
local arraytypes = {}
function Array(T)
local struct ArrayImpl {
data : &T;
N : int;
}
function ArrayImpl.metamethods.__typename(self)
return "Array("..tostring(T)..")"
end
arraytypes[ArrayImpl] = true
terra ArrayImpl:init(N : int)
self.data = [&T](C.malloc(N*sizeof(T)))
self.N = N
end
terra ArrayImpl:free()
C.free(self.data)
end
ArrayImpl.metamethods.__apply = macro(function(self,idx)
return `self.data[idx]
end)
ArrayImpl.metamethods.__methodmissing = macro(function(methodname,selfexp,...)
local args = terralib.newlist {...}
local i = symbol(int)
local promotedargs = args:map(function(a)
if arraytypes[a:gettype()] then
return `a(i)
else
return a
end
end)
return quote
var self = selfexp
var r : ArrayImpl
r:init(self.N)
for [i] = 0,r.N do
r.data[i] = self.data[i]:[methodname](promotedargs)
end
in
r
end
end)
return ArrayImpl
end
struct Complex {
real : float;
imag : float;
}
terra Complex:add(c : Complex)
return Complex { self.real + c.real, self.imag + c.imag }
end
ComplexArray = Array(Complex)
N = 10
terra testit()
var ca : ComplexArray
ca:init(N)
for i = 0,N do
ca(i) = Complex { i, i + 1 }
end
var ra = ca:add(ca)
return ra
end
local r = testit()
assert(r.N == N)
for i = 0,N-1 do
assert(r.data[i].real == 2*i)
assert(r.data[i].imag == 2*(i+1))
end
assert(tostring(Array(int)) == "Array(int32)")

View File

@@ -0,0 +1,150 @@
local C = terralib.includecstring[[
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
]]
pi = 3.141592653589793
solar_mass = (4 * pi * pi)
days_per_year = 365.24
struct planet {
x : double;
y : double;
z : double;
vx : double;
vy : double;
vz : double;
mass : double;
}
terra advance(nbodies : int, bodies : &planet, dt : double)
for i = 0, nbodies do
var b = &bodies[i]
for j = i + 1, nbodies do
var b2 = &bodies[j]
var dx = b.x - b2.x;
var dy = b.y - b2.y;
var dz = b.z - b2.z;
var distance = C.sqrt(dx * dx + dy * dy + dz * dz);
var mag = dt / (distance * distance * distance);
--C.printf("%f %f %f %f %f\n",dx,dy,dz,distance,mag);
b.vx = b.vx - dx * b2.mass * mag;
b.vy = b.vy - dy * b2.mass * mag;
b.vz = b.vz - dz * b2.mass * mag;
b2.vx = b2.vx + dx * b.mass * mag;
b2.vy = b2.vy + dy * b.mass * mag;
b2.vz = b2.vz + dz * b.mass * mag;
--C.printf("%f %f %f %f %f %f\n",b.vx,b.vy,b.vz,b2.vx,b2.vy,b2.vz)
end
end
for i = 0,nbodies do
var b = &bodies[i]
b.x = b.x + dt * b.vx;
b.y = b.y + dt * b.vy;
b.z = b.z + dt * b.vz;
end
end
terra energy(nbodies : int, bodies : &planet)
var e = 0.0
for i = 0, nbodies do
var b = &bodies[i]
e = e + 0.5 * b.mass * (b.vx * b.vx + b.vy * b.vy + b.vz * b.vz);
for j = i + 1, nbodies do
var b2 = &bodies[j]
var dx = b.x - b2.x
var dy = b.y - b2.y
var dz = b.z - b2.z
var distance = C.sqrt(dx * dx + dy * dy + dz * dz)
e = e - (b.mass * b2.mass) / distance
end
end
return e
end
terra offset_momentum(nbodies : int, bodies : &planet)
var px,py,pz = 0.0,0.0,0.0
for i = 0,nbodies do
px = px + bodies[i].vx * bodies[i].mass
py = py + bodies[i].vy * bodies[i].mass
pz = pz + bodies[i].vz * bodies[i].mass
end
bodies[0].vx = - px / solar_mass
bodies[0].vy = - py / solar_mass
bodies[0].vz = - pz / solar_mass
end
NBODIES = 5
terra main(argc : int, argv : &&int8)
var bodies = array(
planet { -- sun */
0, 0, 0, 0, 0, 0, solar_mass
},
planet { -- jupiter */
4.84143144246472090e+00,
-1.16032004402742839e+00,
-1.03622044471123109e-01,
1.66007664274403694e-03 * days_per_year,
7.69901118419740425e-03 * days_per_year,
-6.90460016972063023e-05 * days_per_year,
9.54791938424326609e-04 * solar_mass
},
planet { -- saturn */
8.34336671824457987e+00,
4.12479856412430479e+00,
-4.03523417114321381e-01,
-2.76742510726862411e-03 * days_per_year,
4.99852801234917238e-03 * days_per_year,
2.30417297573763929e-05 * days_per_year,
2.85885980666130812e-04 * solar_mass
},
planet { -- uranus */
1.28943695621391310e+01,
-1.51111514016986312e+01,
-2.23307578892655734e-01,
2.96460137564761618e-03 * days_per_year,
2.37847173959480950e-03 * days_per_year,
-2.96589568540237556e-05 * days_per_year,
4.36624404335156298e-05 * solar_mass
},
planet { -- neptune */
1.53796971148509165e+01,
-2.59193146099879641e+01,
1.79258772950371181e-01,
2.68067772490389322e-03 * days_per_year,
1.62824170038242295e-03 * days_per_year,
-9.51592254519715870e-05 * days_per_year,
5.15138902046611451e-05 * solar_mass
}
)
var n = C.atoi(argv[1])
offset_momentum(NBODIES, bodies)
C.printf ("%.9f\n", energy(NBODIES, bodies))
for i = 0,n do
advance(NBODIES, bodies, 0.01)
end
C.printf ("%.9f\n", energy(NBODIES, bodies));
return 0
end
terra run()
main(2,array("what","1000000"))
end
--run:compile()
--local test = require("test")
--print(test.time(run))
terralib.saveobj("benchmark_nbody",{ main = main } )
energy:disas()
energy:printpretty()