Consider the code below. ('./gridencoder/src/gridencoder.cu #'166---#191)
#pragma unroll
for (uint32_t idx = 0; idx < (1 << D); idx++) {
float w = 1;
uint32_t pos_grid_local[D];
#pragma unroll
for (uint32_t d = 0; d < D; d++) {
if ((idx & (1 << d)) == 0) {
w *= 1 - pos[d];
pos_grid_local[d] = pos_grid[d];
} else {
w *= pos[d];
pos_grid_local[d] = pos_grid[d] + 1;
}
}
uint32_t index = get_grid_index<D, C>(gridtype, align_corners, 0, hashmap_size, resolution, pos_grid_local);
// writing to register (fast)
#pragma unroll
for (uint32_t ch = 0; ch < C; ch++) {
results[ch] += w * grid[index + ch];
}
//printf("[b=%d, l=%d] int %d, idx %d, w %f, val %f\n", b, level, idx, index, w, grid[index]);
}
If my understanding is right,
the first loop with idx is to iterate each neighbour vertex , and
the second loop with d is to iterate each dimension.
you are stacking the result of each vertex to variable 'results'.
However,
In 3D interpolation, each dimension has is own weight. So I guess the float w= 1 should be replaced by w[D]?
The updated version is shown below
Consider the code below. ('./gridencoder/src/gridencoder.cu #'166---#191)
If my understanding is right, the first loop with idx is to iterate each neighbour vertex , and the second loop with d is to iterate each dimension. you are stacking the result of each vertex to variable 'results'.
However, In 3D interpolation, each dimension has is own weight. So I guess the float w= 1 should be replaced by w[D]? The updated version is shown below
In your version, 'w' is shrinking in each dimension. And eventually become a small number.
I am not very sure as I am just a beginner. Beg for pardon if my understand is wrong.