Phase memrt fails
Compiled with sac2c -t cuda
, fails in phase memrt, node prf.
Version
sac2c 1.3.3-MijasCosta-1079-g648dba-dirty
build-type: DEBUG
built-by: "thomas" at 2023-10-11T13:56:05
dirty only because I added extra debug prints.
#define N 32
inline
double[*] coarse2fine (double[*] z)
{
// return {iv -> z[(iv - 1) / 2] | [1, 1, 1] <= iv < 2 * shape(z) step [2, 2, 2] };
new_shp = _mul_SxV_(2, _shape_A_(z));
return with {
([1, 1, 1] <= iv < new_shp step [2, 2, 2]):
_sel_VxA_(_div_VxS_(_sub_VxV_(iv,
[1, 1, 1]),
2),
z);
}: genarray(new_shp, 0d);
}
inline
double[*] fine2coarse(double[*] r)
{
// return {iv -> r[2 * iv + 1] | iv < shape(r) / 2};
new_shp = _div_VxV_(_shape_A_(r), [2, 2, 2]);
return with {
([0, 0, 0] <= iv < new_shp):
_sel_VxA_(
_add_VxV_(_mul_SxV_(2, iv),
[1, 1, 1]),
r);
}: genarray(new_shp, 0d);
}
/* This specialization must be here for the error to occur.
specialization must also be at least 16. */
specialize double[16,16,16] M (double[16,16,16] r);
double[.,.,.] M (double[.,.,.] r)
{
rs = fine2coarse(r);
zs = M (rs);
z = coarse2fine(zs);
return z;
}
double[4,4,4] M (double[4,4,4] r)
{
return r;
}
double MG (double[N,N,N] v, double[N,N,N] u)
{
/* Must be at least 4 for the error to occur. */
// for (i = 1; i < 4; i++) {
// r = v - u;
// u = u + M(r);
// }
// return u[0, 0, 0];
for (i = 1; _le_SxS_(i, 4); i = _add_SxS_(i, 1)) {
r = with {
(. <= iv <= .): _sub_SxS_(_sel_VxA_(iv, v),
_sel_VxA_(iv, u));
}: genarray(_shape_A_(v), 0d);
Mr = M(r);
u = with {
(. <= iv <= .): _add_SxS_(_sel_VxA_(iv, u),
_sel_VxA_(iv, Mr));
}: genarray(_shape_A_(u), 0d);
}
return _sel_VxA_([0, 0, 0], u);
}
int main()
{
u = with {
([0, 0, 0] <= iv <= [N, N, N]): 2d;
}: genarray([N, N, N], 0d);
v = u;
r = MG (v, u);
return _toi_S_(r);
}