Add foreach and foreach_tiled looping constructs
These make it easier to iterate over arbitrary amounts of data elements; specifically, they automatically handle the "ragged extra bits" that come up when the number of elements to be processed isn't evenly divided by programCount. TODO: documentation
This commit is contained in:
22
tests/foreach-1.ispc
Normal file
22
tests/foreach-1.ispc
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
|
||||
export void f_f(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[i] - 1;
|
||||
|
||||
uniform float sum = 0;
|
||||
for (uniform int i = 0; i < programCount; ++i)
|
||||
sum += val[i];
|
||||
|
||||
RET[programIndex] = sum;
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = reduce_add(programIndex);
|
||||
}
|
||||
33
tests/foreach-10.ispc
Normal file
33
tests/foreach-10.ispc
Normal file
@@ -0,0 +1,33 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
#define NA 4
|
||||
#define NB 8
|
||||
#define NC 7
|
||||
uniform int a[NA][NB][NC];
|
||||
|
||||
for (uniform int i = 0; i < NA; ++i)
|
||||
for (uniform int j = 0; j < NB; ++j)
|
||||
for (uniform int k = 0; j < NC; ++j)
|
||||
a[i][j][k] = 0;
|
||||
|
||||
foreach_tiled (i = 0 ... NA, j = 0 ... NB, k = 0 ... NC) {
|
||||
a[i][j][k] += 1;
|
||||
}
|
||||
|
||||
uniform int errs = 0;
|
||||
for (uniform int i = 0; i < NA; ++i)
|
||||
for (uniform int j = 0; j < NB; ++j)
|
||||
for (uniform int k = 0; j < NC; ++j)
|
||||
if (a[i][j][k] != 1) {
|
||||
//CO print("% % % = %\n", i, j, k, a[i][j][k]);
|
||||
++errs;
|
||||
}
|
||||
|
||||
RET[programIndex] = errs;
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = 0;
|
||||
}
|
||||
22
tests/foreach-11.ispc
Normal file
22
tests/foreach-11.ispc
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
uniform float val[programCount];
|
||||
for (uniform int i = 0; i < programCount; ++i)
|
||||
val[i] = 0;
|
||||
|
||||
foreach_tiled (i = 0 ... programCount)
|
||||
val[i] += aFOO[i] - 1;
|
||||
|
||||
uniform float sum = 0;
|
||||
for (uniform int i = 0; i < programCount; ++i)
|
||||
sum += val[i];
|
||||
|
||||
RET[programIndex] = sum;
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = reduce_add(programIndex);
|
||||
}
|
||||
26
tests/foreach-12.ispc
Normal file
26
tests/foreach-12.ispc
Normal file
@@ -0,0 +1,26 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
|
||||
uniform int foo(int i);
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
uniform float val[programCount];
|
||||
for (uniform int i = 0; i < programCount; ++i)
|
||||
val[i] = 0;
|
||||
|
||||
foreach_tiled (i = 2 ... programCount)
|
||||
val[i] += i;
|
||||
|
||||
uniform float sum = 0;
|
||||
for (uniform int i = 0; i < programCount; ++i) {
|
||||
sum += val[i];
|
||||
}
|
||||
|
||||
RET[programIndex] = sum;
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
int pi = (programIndex >= 2) ? programIndex : 0;
|
||||
RET[programIndex] = reduce_add(pi);
|
||||
}
|
||||
19
tests/foreach-13.ispc
Normal file
19
tests/foreach-13.ispc
Normal file
@@ -0,0 +1,19 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
|
||||
uniform int foo(int i);
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
for (uniform int i = 0; i < programCount; ++i)
|
||||
RET[i] = 0;
|
||||
|
||||
foreach_tiled (i = 0 ... 2)
|
||||
RET[i] = i+1;
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = 0;
|
||||
RET[0] = 1;
|
||||
RET[1] = 2;
|
||||
}
|
||||
17
tests/foreach-14.ispc
Normal file
17
tests/foreach-14.ispc
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
|
||||
uniform int foo(int i);
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
for (uniform int i = 0; i < programCount; ++i)
|
||||
RET[i] = 0;
|
||||
|
||||
foreach_tiled (i = 2 ... 0)
|
||||
RET[i] += 1234;
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = 0;
|
||||
}
|
||||
17
tests/foreach-15.ispc
Normal file
17
tests/foreach-15.ispc
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
|
||||
uniform int foo(int i);
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
for (uniform int i = 0; i < programCount; ++i)
|
||||
RET[i] = 0;
|
||||
|
||||
foreach_tiled (i = 1 ... 1)
|
||||
RET[i] = 1234;
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = 0;
|
||||
}
|
||||
17
tests/foreach-16.ispc
Normal file
17
tests/foreach-16.ispc
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
|
||||
uniform int foo(int i);
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
for (uniform int i = 0; i < programCount; ++i)
|
||||
RET[i] = 0;
|
||||
|
||||
foreach_tiled (i = -2 ... programCount-2)
|
||||
RET[i+2] = 1234;
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = 1234;
|
||||
}
|
||||
13
tests/foreach-17.ispc
Normal file
13
tests/foreach-17.ispc
Normal file
@@ -0,0 +1,13 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
float sum = 0;
|
||||
foreach_tiled (i = 0 ... 6)
|
||||
sum += aFOO[i];
|
||||
RET[programIndex] = reduce_add(sum);
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = 21;
|
||||
}
|
||||
29
tests/foreach-18.ispc
Normal file
29
tests/foreach-18.ispc
Normal file
@@ -0,0 +1,29 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
#define NA 3
|
||||
#define NB 8
|
||||
uniform int a[NA][NB];
|
||||
|
||||
for (uniform int i = 0; i < NA; ++i)
|
||||
for (uniform int j = 0; j < NB; ++j)
|
||||
a[i][j] = 0;
|
||||
|
||||
foreach_tiled (i = 0 ... NA, j = 0 ... NB) {
|
||||
a[i][j] += 1;
|
||||
}
|
||||
|
||||
uniform int errs = 0;
|
||||
for (uniform int i = 0; i < NA; ++i)
|
||||
for (uniform int j = 0; j < NB; ++j)
|
||||
if (a[i][j] != 1) {
|
||||
++errs;
|
||||
}
|
||||
|
||||
RET[programIndex] = errs;
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = 0;
|
||||
}
|
||||
29
tests/foreach-19.ispc
Normal file
29
tests/foreach-19.ispc
Normal file
@@ -0,0 +1,29 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
#define NA 3
|
||||
#define NB 4
|
||||
uniform int a[NA][NB];
|
||||
|
||||
for (uniform int i = 0; i < NA; ++i)
|
||||
for (uniform int j = 0; j < NB; ++j)
|
||||
a[i][j] = 0;
|
||||
|
||||
foreach_tiled (i = 0 ... NA, j = 0 ... NB) {
|
||||
a[i][j] += 1;
|
||||
}
|
||||
|
||||
uniform int errs = 0;
|
||||
for (uniform int i = 0; i < NA; ++i)
|
||||
for (uniform int j = 0; j < NB; ++j)
|
||||
if (a[i][j] != 1) {
|
||||
++errs;
|
||||
}
|
||||
|
||||
RET[programIndex] = errs;
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = 0;
|
||||
}
|
||||
26
tests/foreach-2.ispc
Normal file
26
tests/foreach-2.ispc
Normal file
@@ -0,0 +1,26 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
|
||||
uniform int foo(int i);
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
uniform float val[programCount];
|
||||
for (uniform int i = 0; i < programCount; ++i)
|
||||
val[i] = 0;
|
||||
|
||||
foreach (i = 2 ... programCount)
|
||||
val[i] += i;
|
||||
|
||||
uniform float sum = 0;
|
||||
for (uniform int i = 0; i < programCount; ++i) {
|
||||
sum += val[i];
|
||||
}
|
||||
|
||||
RET[programIndex] = sum;
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
int pi = (programIndex >= 2) ? programIndex : 0;
|
||||
RET[programIndex] = reduce_add(pi);
|
||||
}
|
||||
19
tests/foreach-3.ispc
Normal file
19
tests/foreach-3.ispc
Normal file
@@ -0,0 +1,19 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
|
||||
uniform int foo(int i);
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
for (uniform int i = 0; i < programCount; ++i)
|
||||
RET[i] = 0;
|
||||
|
||||
foreach (i = 0 ... 2)
|
||||
RET[i] = i+1;
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = 0;
|
||||
RET[0] = 1;
|
||||
RET[1] = 2;
|
||||
}
|
||||
17
tests/foreach-4.ispc
Normal file
17
tests/foreach-4.ispc
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
|
||||
uniform int foo(int i);
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
for (uniform int i = 0; i < programCount; ++i)
|
||||
RET[i] = 0;
|
||||
|
||||
foreach (i = 2 ... 0)
|
||||
RET[i] -= 1234;
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = 0;
|
||||
}
|
||||
17
tests/foreach-5.ispc
Normal file
17
tests/foreach-5.ispc
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
|
||||
uniform int foo(int i);
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
for (uniform int i = 0; i < programCount; ++i)
|
||||
RET[i] = 0;
|
||||
|
||||
foreach (i = 1 ... 1)
|
||||
RET[i] = 1234;
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = 0;
|
||||
}
|
||||
17
tests/foreach-6.ispc
Normal file
17
tests/foreach-6.ispc
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
|
||||
uniform int foo(int i);
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
for (uniform int i = 0; i < programCount; ++i)
|
||||
RET[i] = 0;
|
||||
|
||||
foreach (i = -2 ... programCount-2)
|
||||
RET[i+2] += 1234;
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = 1234;
|
||||
}
|
||||
13
tests/foreach-7.ispc
Normal file
13
tests/foreach-7.ispc
Normal file
@@ -0,0 +1,13 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
float sum = 0;
|
||||
foreach (i = 0 ... 6)
|
||||
sum += aFOO[i];
|
||||
RET[programIndex] = reduce_add(sum);
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = 21;
|
||||
}
|
||||
23
tests/foreach-8.ispc
Normal file
23
tests/foreach-8.ispc
Normal file
@@ -0,0 +1,23 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
float sum1 = 0, sum2 = 0;
|
||||
foreach (x = 0 ... 10, i = 0 ... 6) {
|
||||
sum1 += aFOO[i];
|
||||
}
|
||||
|
||||
for (uniform int x = 0; x < 10; ++x) {
|
||||
for (uniform int i = 0; i < 6; i += programCount) {
|
||||
int index = i + programIndex;
|
||||
if (index < 6)
|
||||
sum2 += aFOO[index];
|
||||
}
|
||||
}
|
||||
|
||||
RET[programIndex] = sum1 - sum2;
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = 0;
|
||||
}
|
||||
29
tests/foreach-9.ispc
Normal file
29
tests/foreach-9.ispc
Normal file
@@ -0,0 +1,29 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
#define NA 1
|
||||
#define NB 3
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
uniform int a[NA][NB];
|
||||
|
||||
for (uniform int i = 0; i < NA; ++i)
|
||||
for (uniform int j = 0; j < NB; ++j)
|
||||
a[i][j] = 0;
|
||||
|
||||
foreach (i = 0 ... NA, j = 0 ... NB) {
|
||||
a[i][j] += 1;
|
||||
}
|
||||
|
||||
uniform int errs = 0;
|
||||
for (uniform int i = 0; i < NA; ++i)
|
||||
for (uniform int j = 0; j < NB; ++j)
|
||||
if (a[i][j] != 1)
|
||||
++errs;
|
||||
|
||||
RET[programIndex] = errs;
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = 0;
|
||||
}
|
||||
Reference in New Issue
Block a user