Volumes 101 – pt. 17 Multistate Cellular Automata in OpenCl_哔哩哔哩_bilibili
kernel void kernelName(
int A_stride_x,
int A_stride_y,
int A_stride_z,
int A_stride_offset,
global float * A ,
global float * B
)
{
int gidx = get_global_id(0);
int gidy = get_global_id(1);
int gidz = get_global_id(2);
int idx = A_stride_offset + A_stride_x * gidx
+ A_stride_y * gidy
+ A_stride_z * gidz;
int val = A[idx];
int sum = 0;
for (int xo = -1;xo<=1;xo++){
for( int yo = -1;yo<=1;yo++){
for(int zo = -1;zo<=1;zo++){
int nidx = A_stride_offset
+ A_stride_x*(gidx+xo)
+ A_stride_y *(gidy+yo)
+A_stride_z*(gidz+zo);
int neighval = A[nidx];
if(neighval >0){
sum++;
}
}}}
B[idx] = A[idx];
if(val>0){
if(sum==4){}
else{
B[idx]=0;
}
}
else{
if(sum==4){
B[idx] =1;
}
}
}
kernel void writeBack(
int A_stride_x,
int A_stride_y,
int A_stride_z,
int A_stride_offset,
global float * A ,
global float * B
)
{
int gidx = get_global_id(0);
int gidy = get_global_id(1);
int gidz = get_global_id(2);
int idx = A_stride_offset + A_stride_x * gidx
+ A_stride_y * gidy
+ A_stride_z * gidz;
A[idx] = B[idx];
}