Кто-нибудь знает правильный способ вычисления среднего значения буфера со случайными числами с плавающей точкой в металлическом ядре?Расчет среднего значения в металлическом ядре
Диспетчерская работа по командной вычислений кодера:
threadsPerGroup = MTLSizeMake(1, 1, inputTexture.arrayLength);
numThreadGroups = MTLSizeMake(1, 1, inputTexture.arrayLength/threadsPerGroup.depth);
[commandEncoder dispatchThreadgroups:numThreadGroups
threadsPerThreadgroup:threadsPerGroup];
Код ядра:
kernel void mean(texture2d_array<float, access::read> inTex [[ texture(0) ]],
device float *means [[ buffer(1) ]],
uint3 id [[ thread_position_in_grid ]]) {
if (id.x == 0 && id.y == 0) {
float mean = 0.0;
for (uint i = 0; i < inTex.get_width(); ++i) {
for (uint j = 0; j < inTex.get_height(); ++j) {
mean += inTex.read(uint2(i, j), id.z)[0];
}
}
float textureArea = inTex.get_width() * inTex.get_height();
mean /= textureArea;
out[id.z] = mean;
}
}
Буфер представлен в текстуру texture2d_array типа с форматом R32Float пикселей.
Мои значения с плавающей точкой варьируются от ~ 1E-15 до ~ 1E8, и есть и отрицательные значения. Я не могу отличить их от int или uint с приемлемой точностью. –