Для приложения iOS с шейдером Metal Performance я хотел бы написать функцию ускорения GPU для обратного распространения среднего уровня пула CNN. Это в значительной степени то же самое, что и передискретизация изображения. Например, если на входе
2 5 6
3 6 7
8 9 0
изображение с повышенным разрешением должно быть
2 2 5 5 6 6
2 2 5 5 6 6
3 3 6 6 7 7
3 3 6 6 7 7
8 8 9 9 0 0
8 8 9 9 0 0
Я написал следующую функцию ядра:
kernel void upsample(texture2d<float, access::read> inTexture [[texture(0)]],
texture2d<float, access::write> outTexture [[texture(1)]],
uint2 gid [[thread_position_in_grid]])
{
const float4 color = inTexture.read(gid);
uint2 p;
p = uint2(gid.x * 2, gid.y * 2);
outtexture.write(color, p);
p = uint2(gid.x * 2 + 1, gid.y * 2);
outtexture.write(color, p);
p = uint2(gid.x * 2, gid.y * 2 + 1);
outtexture.write(color, p);
p = uint2(gid.x * 2 + 1, gid.y * 2 + 1);
outtexture.write(color, p);
}
Но я не уверен, правильно ли это. Как мне узнать, что исходный "gid" связан с координатами входной текстуры, но не с выходной текстурой?