GPGPUで整数計算(9)

配列

配列は次のように宣言して使う。


int a[10];

関数に引き渡すには次のようにする。


void f(in int a[10]);

f(a);

型にinがつくと、入力、
outがつくと、出力、
inoutがつくと、入出力になる。


次の例は、

an = a0 + ... + an-1
s = a0 + ... + an

を、a0を変えて計算する。
しかし、配列の大きさが1024より大きくなるとうまく動かなかった。
この問題ではそうだが、他では大きさの限界が違うかもしれない。


uniform sampler2DRect texUnit0; // data

const int N = 1023;

void calc(inout int a[N+1]);
int sum(in int a[N+1]);

void main(void) {
int n = int(texRECT(texUnit0, gl_FragCoord.xy).x);
if(n == 0)
return;

int a[N+1];
a[0] = n;
calc(a);
int s = sum(a);

gl_FragColor = vec4(a[N], s, 0, 0);
}

void calc(inout int a[N+1]) {
for(int i = 1; i <= N; i++) {
a[i] = 0;
for(int k = 0; k < i; k++)
a[i] += a[k];
}
}

int sum(in int a[N+1]) {
int s = 0;
for(int i = 0; i <= N; i++)
s += a[i];
return s;
}