merged with nvptx

This commit is contained in:
Evghenii
2014-02-20 11:01:58 +01:00
68 changed files with 8181 additions and 470 deletions

View File

@@ -5,7 +5,13 @@ export uniform int width() { return programCount; }
export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
float a = aFOO[programIndex];
assert(programCount <= 64);
#ifdef __NVPTX__
uniform float * uniform xarr = uniform new uniform float[70*70];
uniform float (* uniform x)[70] = (uniform float (* uniform)[70])xarr;
#define _SHMALLOC
#else
uniform float x[70][70];
#endif
for (uniform int i = 0; i < 70; ++i)
for (uniform int j = 0; j < 70; ++j)
x[i][j] = 2+b-5;
@@ -16,6 +22,10 @@ export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
else
x[b-1][a-1] = 1;
RET[programIndex] = x[4][a];
#ifdef _SHMALLOC
delete xarr;
#endif
}
export void result(uniform float RET[]) {

View File

@@ -3,7 +3,7 @@ export uniform int width() { return programCount; }
export void f_f(uniform float RET[], uniform float aFOO[]) {
float a = aFOO[programIndex];
float b = (programCount == 1) ? 3 : broadcast(a, 2);
float b = (programCount == 1) ? 4 : broadcast(a, 2);
RET[programIndex] = b;
}

View File

@@ -19,8 +19,11 @@ export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
export void result(uniform float RET[]) {
RET[0] = RET[4] = RET[8] = RET[12] = 2;
RET[1] = RET[5] = RET[9] = RET[13] = 3;
RET[2] = RET[6] = RET[10] = RET[14] = 5;
RET[3] = RET[7] = RET[11] = RET[15] = 6;
for (int i = 0; i < programCount; i += 4)
{
RET[i+0] = 2;
RET[i+1] = 3;
RET[i+2] = 5;
RET[i+3] = 6;
}
}

View File

@@ -18,6 +18,9 @@ export void f_fu(uniform float RET[4], uniform float aFOO[4], uniform float b) {
export void result(uniform float RET[]) {
RET[programIndex] = 3;
RET[0] = RET[4] = RET[8] = RET[12] = 1;
RET[3] = RET[7] = RET[11] = RET[15] = 29;
for (int i = 0; i < programCount; i += 4)
{
RET[i+0] = 1;
RET[i+3] = 29;
}
}

View File

@@ -19,6 +19,9 @@ export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
export void result(uniform float RET[]) {
RET[programIndex] = 32;
RET[2] = RET[6] = RET[10] = RET[14] = 38;
RET[3] = RET[7] = RET[11] = RET[15] = 39;
for (int i = 0; i < programCount; i += 4)
{
RET[i+2] = 38;
RET[i+3] = 39;
}
}

View File

@@ -4,14 +4,14 @@ export uniform int width() { return programCount; }
struct Foo {
uniform float x[17];
uniform float x[programCount+1];
};
export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
float a = aFOO[programIndex];
uniform Foo foo;
uniform int i;
cfor (i = 0; i < 17; ++i)
cfor (i = 0; i < programCount+1; ++i)
foo.x[i] = i;
if ((int)a & 1)

View File

@@ -4,9 +4,9 @@ export uniform int width() { return programCount; }
export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
float a = aFOO[programIndex];
uniform double udx[25][25];
cfor (uniform int i = 0; i < 25; ++i)
cfor (uniform int j = 0; j < 25; ++j)
uniform double udx[programCount+1][programCount+1];
cfor (uniform int i = 0; i < programCount+1; ++i)
cfor (uniform int j = 0; j < programCount+1; ++j)
udx[i][j] = 10*i+j;
int x = 1;

View File

@@ -5,9 +5,9 @@ export uniform int width() { return programCount; }
export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
float a = aFOO[programIndex];
uniform float udx[20][20];
cfor (uniform int i = 0; i < 20; ++i)
cfor (uniform int j = 0; j < 20; ++j)
uniform float udx[programCount+1][programCount+1];
cfor (uniform int i = 0; i < programCount+1; ++i)
cfor (uniform int j = 0; j < programCount+1; ++j)
udx[i][j] = 100*i+j;
int x = 1;

View File

@@ -4,19 +4,27 @@ export uniform int width() { return programCount; }
struct Foo {
uniform float udx[25][25];
uniform float udx[32][32];
};
export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
float a = aFOO[programIndex];
#ifndef __NVPTX__
uniform Foo f[5];
#else /* too much shared memory allocated, nvcc fails to link */
uniform Foo * uniform f = uniform new uniform Foo[5];
#define _UNMALLOC
#endif
cfor (uniform int i = 0; i < 5; ++i)
cfor (uniform int j = 0; j < 25; ++j)
cfor (uniform int k = 0; k < 25; ++k)
cfor (uniform int j = 0; j < 32; ++j)
cfor (uniform int k = 0; k < 32; ++k)
f[i].udx[j][k] = 1000*i+100*j+k;
int x = 1;
RET[programIndex] = f[x+1].udx[b-4][programIndex];
#ifdef _UNMALLOC
delete f;
#endif
}
export void result(uniform float RET[]) { RET[programIndex] = 2100 +programIndex; }

View File

@@ -13,9 +13,9 @@ float func(Foo foo[], int offset) {
export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
float a = aFOO[programIndex];
Foo foo[17];
Foo foo[programCount+1];
uniform int i;
cfor (i = 0; i < 17; ++i)
cfor (i = 0; i < programCount+1; ++i)
foo[i].f = i*a;
RET[programIndex] = func(foo, (int)a);
}

View File

@@ -13,9 +13,9 @@ float func(Foo foo[], int offset) {
export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
float a = aFOO[programIndex];
Foo foo[17];
Foo foo[programCount+1];
uniform int i;
cfor (i = 0; i < 17; ++i)
cfor (i = 0; i < programCount+1; ++i)
foo[i].f = i*a;
RET[programIndex] = func(foo, (int)a);
}

View File

@@ -9,9 +9,9 @@ struct Foo {
export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
float a = aFOO[programIndex];
Foo foo[17];
Foo foo[programCount+1];
uniform int i;
cfor (i = 0; i < 17; ++i)
cfor (i = 0; i < programCount+1; ++i)
foo[i].f = i*a;
RET[programIndex] = foo[(int)a].f;
}

View File

@@ -10,9 +10,9 @@ struct Foo {
export void f_fi(uniform float RET[], uniform float aFOO[], uniform int bFOO[]) {
float a = aFOO[programIndex];
int b = bFOO[programIndex];
varying Foo myFoo[17];
varying Foo myFoo[programCount+1];
uniform int i;
cfor (i = 0; i < 17; ++i) {
cfor (i = 0; i < programCount+1; ++i) {
myFoo[i].x = i;
myFoo[i].f = 2*i;
}

View File

@@ -17,8 +17,11 @@ export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
export void result(uniform float RET[]) {
RET[0] = RET[4] = RET[8] = RET[12] = 1;
RET[1] = RET[5] = RET[9] = RET[13] = 3;
RET[2] = RET[6] = RET[10] = RET[14] = 3;
RET[3] = RET[7] = RET[11] = RET[15] = 29;
for (int i = 0; i < programCount; i += 4)
{
RET[i+0] = 1;
RET[i+1] = 3;
RET[i+2] = 3;
RET[i+3] = 29;
}
}

View File

@@ -17,8 +17,11 @@ export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
export void result(uniform float RET[]) {
RET[0] = RET[4] = RET[8] = RET[12] = 1;
RET[1] = RET[5] = RET[9] = RET[13] = 3;
RET[2] = RET[6] = RET[10] = RET[14] = 3;
RET[3] = RET[7] = RET[11] = RET[15] = 29;
for (int i = 0; i < programCount; i += 4)
{
RET[i+0] = 1;
RET[i+1] = 3;
RET[i+2] = 3;
RET[i+3] = 29;
}
}

View File

@@ -17,8 +17,11 @@ export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
export void result(uniform float RET[]) {
RET[0] = RET[4] = RET[8] = RET[12] = 1;
RET[1] = RET[5] = RET[9] = RET[13] = 3;
RET[2] = RET[6] = RET[10] = RET[14] = 3;
RET[3] = RET[7] = RET[11] = RET[15] = 29;
for (int i = 0; i < programCount; i += 4)
{
RET[i+0] = 1;
RET[i+1] = 3;
RET[i+2] = 3;
RET[i+3] = 29;
}
}

View File

@@ -19,8 +19,11 @@ export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
export void result(uniform float RET[]) {
RET[0] = RET[4] = RET[8] = RET[12] = 2;
RET[1] = RET[5] = RET[9] = RET[13] = 3;
RET[2] = RET[6] = RET[10] = RET[14] = 5;
RET[3] = RET[7] = RET[11] = RET[15] = 6;
for (int i = 0; i < programCount; i += 4)
{
RET[i+0] = 2;
RET[i+1] = 3;
RET[i+2] = 5;
RET[i+3] = 6;
}
}

View File

@@ -17,8 +17,11 @@ export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
export void result(uniform float RET[]) {
RET[0] = RET[4] = RET[8] = RET[12] = 1;
RET[1] = RET[5] = RET[9] = RET[13] = 3;
RET[2] = RET[6] = RET[10] = RET[14] = 3;
RET[3] = RET[7] = RET[11] = RET[15] = 29;
for (int i = 0; i < programCount; i += 4)
{
RET[i+0] = 1;
RET[i+1] = 3;
RET[i+2] = 3;
RET[i+3] = 29;
}
}

View File

@@ -18,8 +18,11 @@ export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
export void result(uniform float RET[]) {
RET[0] = RET[4] = RET[8] = RET[12] = 32;
RET[1] = RET[5] = RET[9] = RET[13] = 32;
RET[2] = RET[6] = RET[10] = RET[14] = 38;
RET[3] = RET[7] = RET[11] = RET[15] = 39;
for (int i = 0; i < programCount; i += 4)
{
RET[i+0] = 32;
RET[i+1] = 32;
RET[i+2] = 38;
RET[i+3] = 39;
}
}

View File

@@ -8,9 +8,9 @@ struct Foo {
};
export void f_fi(uniform float RET[], uniform float a[], uniform int bFOO[]) {
int b = bFOO[programIndex];
uniform struct Foo myFoo[17];
uniform struct Foo myFoo[programCount+1];
uniform int i;
cfor (i = 0; i < 17; ++i) {
cfor (i = 0; i < programCount+1; ++i) {
myFoo[i].x = i;
myFoo[i].f = 2*i;
}

View File

@@ -6,7 +6,7 @@ export uniform int width() { return programCount; }
export void f_f(uniform float RET[], uniform float aFOO[]) {
float a = aFOO[programIndex];
uniform int x = (1 << 4) - ~0xf0f0f0f0 + (2 * 8 / 2);
static uniform int y = (1 << 4) - ~0xf0f0f0f0 + (2 * 8 / 2);
const static uniform int y = (1 << 4) - ~0xf0f0f0f0 + (2 * 8 / 2);
RET[programIndex] = (x == y) ? 1. : 0.;
}

View File

@@ -6,7 +6,7 @@ export uniform int width() { return programCount; }
export void f_f(uniform float RET[], uniform float aFOO[]) {
float a = aFOO[programIndex];
uniform int x = (170 >> 4) % 5;
static uniform int y = (170 >> 4) % 5;
const static uniform int y = (170 >> 4) % 5;
RET[programIndex] = (x == y) ? 1. : 0.;
}

View File

@@ -6,7 +6,7 @@ export uniform int width() { return programCount; }
export void f_f(uniform float RET[], uniform float aFOO[]) {
float a = aFOO[programIndex];
uniform int x = (17 < 2) || (6 >= 5) && (20 >= 20);
static uniform int y = (17 < 2) || (6 >= 5) && (20 >= 20);
const static uniform int y = (17 < 2) || (6 >= 5) && (20 >= 20);
RET[programIndex] = ((x!=0) == (y!=0)) ? 1. : 0.;
}

View File

@@ -2,22 +2,23 @@
export uniform int width() { return programCount; }
#define N0 10
#define N0 12
#define N1 20
#define N2 50
static uniform float array[N2][N1][N0];
task void x(const float f) {
task void x(const uniform float farray[]) {
const float f = farray[programIndex];
uniform int j;
assert(taskCount == (int32)N0*N1*N2);
assert(taskCount0 == (int32)N0);
assert(taskCount1 == (int32)N1);
assert(taskCount2 == (int32)N2);
assert(taskIndex == (int32)taskIndex0 + (int32)N0*(taskIndex1 +(int32) N1*taskIndex2));
assert(taskIndex0 < (int32)N0);
assert(taskIndex1 < (int32)N1);
assert(taskIndex2 < (int32)N2);
assert(taskCount == (uniform int32)N0*N1*N2);
assert(taskCount0 == (uniform int32)N0);
assert(taskCount1 == (uniform int32)N1);
assert(taskCount2 == (uniform int32)N2);
assert(taskIndex == (uniform int32)taskIndex0 + (uniform int32)N0*(taskIndex1 +(uniform int32) N1*taskIndex2));
assert(taskIndex0 < (uniform int32)N0);
assert(taskIndex1 < (uniform int32)N1);
assert(taskIndex2 < (uniform int32)N2);
const uniform int i0 = taskIndex0;
const uniform int i1 = taskIndex1;
@@ -30,7 +31,7 @@ task void x(const float f) {
array[i2][i1][i0] = i;
}
export void f_f(uniform float RET[], uniform float fFOO[]) {
float f = fFOO[programIndex];
uniform float * uniform f = fFOO;
launch[N2][N1][N0] x(f);
sync;
RET[programIndex] = array[N2-1][N1-1][N0-1];
@@ -38,5 +39,5 @@ export void f_f(uniform float RET[], uniform float fFOO[]) {
export void result(uniform float RET[]) {
RET[programIndex] = 9999.000000;
RET[programIndex] = 11999.000000;
}

View File

@@ -2,12 +2,13 @@
export uniform int width() { return programCount; }
#define N0 10
#define N0 12
#define N1 20
#define N2 50
static uniform float array[N2][N1][N0];
task void x(const float f) {
task void x(const uniform float farray[]) {
const float f = farray[programIndex];
uniform int j;
assert(taskCount == (int32)N0*N1*N2);
@@ -30,13 +31,13 @@ task void x(const float f) {
array[i2][i1][i0] = i;
}
export void f_f(uniform float RET[], uniform float fFOO[]) {
float f = fFOO[programIndex];
launch[N0,N1,N2] x(f);
uniform float * uniform f = fFOO;
launch[N2][N1][N0] x(f);
sync;
RET[programIndex] = array[N2-1][N1-1][N0-1];
}
export void result(uniform float RET[]) {
RET[programIndex] = 9999.000000;
RET[programIndex] = 11999.000000;
}

View File

@@ -1,4 +1,9 @@
#ifdef __NVPTX__
uniform int _off[programCount];
#define off _off[programIndex]
#else /* global varying data types are not yet supported with "nvptx" target */
int off;
#endif
export uniform int width() { return programCount; }
@@ -22,11 +27,11 @@ struct S operator/(struct S rr, struct S rv) {
return c;
}
struct S a;
struct S b;
struct S d;
export void f_f(uniform float RET[], uniform float aFOO[]) {
struct S a;
struct S b;
struct S d;
int T = programIndex;
a.a = aFOO[programIndex];
b.a = -aFOO[programIndex];

View File

@@ -15,6 +15,16 @@ static void p(uniform float *uniform ptr) {
}
export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
#ifdef __NVPTX__ /* soa is converted to shared memory story for now, use smaller amount to check the test */
soa<4> Point pts[10];
for (uniform int i = 0; i < 40; ++i) {
pts[i].x = b*i;
pts[i].y[0] = 2*b*i;
pts[i].y[1] = 2*b*i+1;
pts[i].y[2] = 2*b*i+2;
pts[i].z = 3*b*i;
}
#else
soa<4> Point pts[30];
for (uniform int i = 0; i < 120; ++i) {
pts[i].x = b*i;
@@ -23,6 +33,7 @@ export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
pts[i].y[2] = 2*b*i+2;
pts[i].z = 3*b*i;
}
#endif
float a = aFOO[programIndex];
a *= -1;

View File

@@ -16,6 +16,16 @@ static void p(uniform float *uniform ptr) {
}
export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
#ifdef __NVPTX__ /* soa is converted to shared memory story for now, use smaller amount to check the test */
soa<4> Point pts[15];
for (uniform int i = 0; i < 60; ++i) {
pts[i].x = b*i;
pts[i].y[0] = 2*b*i;
pts[i].y[1] = 2*b*i+1;
pts[i].y[2] = 2*b*i+2;
pts[i].z = 3*b*i;
}
#else
soa<4> Point pts[40];
for (uniform int i = 0; i < 160; ++i) {
pts[i].x = b*i;
@@ -24,6 +34,7 @@ export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
pts[i].y[2] = 2*b*i+2;
pts[i].z = 3*b*i;
}
#endif
float a = aFOO[programIndex];
a *= -1;

View File

@@ -25,7 +25,7 @@ export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
}
}
}
assert(programIndex < 80);
RET[programIndex] = pts[programIndex].pts[programIndex % 3][programIndex % 4].z;
}

View File

@@ -6,6 +6,17 @@ export uniform int width() { return programCount; }
export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
float a = aFOO[programIndex];
#ifdef __NVPTX__ /* soa is converted to shared memory story for now, use smaller amount to check the test */
soa<8> Point pts[4];
//CO uniform Point pts[80];
foreach (i = 0 ... 40) {
pts[i].x = b*i;
pts[i].y[0] = 2*b*i;
pts[i].y[1] = 2*b*i+1;
pts[i].y[2] = 2*b*i+2;
pts[i].z = 3*b*i;
}
#else
soa<8> Point pts[10];
//CO uniform Point pts[80];
foreach (i = 0 ... 80) {
@@ -15,6 +26,7 @@ export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
pts[i].y[2] = 2*b*i+2;
pts[i].z = 3*b*i;
}
#endif
assert(programCount < 80);
RET[programIndex] = pts[programIndex].y[2];

View File

@@ -17,8 +17,11 @@ export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
export void result(uniform float RET[]) {
RET[0] = RET[4] = RET[8] = RET[12] = 1;
RET[1] = RET[5] = RET[9] = RET[13] = 3;
RET[2] = RET[6] = RET[10] = RET[14] = 3;
RET[3] = RET[7] = RET[11] = RET[15] = 29;
for (int i = 0; i < programCount; i += 4)
{
RET[i+0] = 1;
RET[i+1] = 3;
RET[i+2] = 3;
RET[i+3] = 29;
}
}

View File

@@ -17,8 +17,11 @@ export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
export void result(uniform float RET[]) {
RET[0] = RET[4] = RET[8] = RET[12] = 1;
RET[1] = RET[5] = RET[9] = RET[13] = 3;
RET[2] = RET[6] = RET[10] = RET[14] = 3;
RET[3] = RET[7] = RET[11] = RET[15] = 29;
for (int i = 0; i < programCount; i += 4)
{
RET[i+0] = 1;
RET[i+1] = 3;
RET[i+2] = 3;
RET[i+3] = 29;
}
}

View File

@@ -17,8 +17,11 @@ export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
export void result(uniform float RET[]) {
RET[0] = RET[4] = RET[8] = RET[12] = 1;
RET[1] = RET[5] = RET[9] = RET[13] = 3;
RET[2] = RET[6] = RET[10] = RET[14] = 3;
RET[3] = RET[7] = RET[11] = RET[15] = 29;
for (int i = 0; i < programCount; i += 4)
{
RET[i+0] = 1;
RET[i+1] = 3;
RET[i+2] = 3;
RET[i+3] = 29;
}
}

View File

@@ -8,8 +8,11 @@ export void f_f(uniform float RET[], uniform float aFOO[]) {
}
export void result(uniform float RET[]) {
RET[0] = RET[4] = RET[8] = RET[12] = 0x0.0p+0;
RET[1] = RET[5] = RET[9] = RET[13] = 0x1.62e43p-1;
RET[2] = RET[6] = RET[10] = RET[14] = 0x1.193ea8p+0;
RET[3] = RET[7] = RET[11] = RET[15] = 0x1.62e43p+0;
for (int i = 0; i < programCount; i += 4)
{
RET[i+0] = 0x0.0p+0;
RET[i+1] = 0x1.62e43p-1;
RET[i+2] = 0x1.193ea8p+0;
RET[i+3] = 0x1.62e43p+0;
}
}

View File

@@ -5,7 +5,7 @@ export uniform int width() { return programCount; }
export void f_f(uniform float RET[], uniform float aFOO[]) {
float a = aFOO[programIndex];
// calculation error 1e-6 is the same as in icc
RET[programIndex] = (exp(-log(1/a)) - a) < 1e-6 ? 1 : 0;
RET[programIndex] = (exp(-log(1/a)) - a)/a < 1e-6 ? 1 : 0;
}
export void result(uniform float RET[4]) {

View File

@@ -4,7 +4,7 @@ export uniform int width() { return programCount; }
export void f_f(uniform float RET[], uniform float aFOO[]) {
float a = aFOO[programIndex];
RET[programIndex] = round(a+.499999);
RET[programIndex] = round(a+.49999);
}
export void result(uniform float RET[]) {

View File

@@ -4,7 +4,7 @@ export uniform int width() { return programCount; }
export void f_f(uniform float RET[], uniform float aFOO[]) {
float a = aFOO[programIndex];
RET[programIndex] = floor(a+.999999);
RET[programIndex] = floor(a+.99999);
}
export void result(uniform float RET[]) {

34
tests/uniform-1.ispc Normal file
View File

@@ -0,0 +1,34 @@
export uniform int width() { return programCount; }
task void f_f_task(uniform float RET[], uniform float aFOO[]) {
uniform float val[programCount];
for (uniform int i = 0; i < programCount; ++i)
val[i] = 0;
foreach (i = 0 ... programCount)
val[i] += aFOO[programCount*taskIndex + i] - 1;
uniform float sum = 0;
for (uniform int i = 0; i < programCount; ++i)
sum += val[i];
if (programIndex < 32/4)
RET[programCount/4*taskIndex + programIndex] = sum;
}
export void f_f(uniform float RET[], uniform float aFOO[])
{
launch[4] f_f_task(RET, aFOO);
}
task void result_task(uniform float RET[])
{
const uniform float ret = reduce_add(programIndex + programCount*taskIndex);
if (programIndex < 32/4)
RET[programCount/4*taskIndex + programIndex] = ret;
}
export void result(uniform float RET[]) {
launch[4] result_task(RET);
}