3
누구나 금속 커널에서 임의의 부동 소수점을 가진 버퍼의 평균값을 계산하는 적절한 방법을 알고 있습니까? 컴퓨팅 명령 엔코더금속 커널의 평균값 계산
디스패치 일 :
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;
}
}
버퍼는 R32Float 픽셀 포맷 texture2d_array 유형의 텍스처로 표현된다.
플로트 값이 ~ 1E-15에서 ~ 1E8까지 다양하며 음수 값도 있습니다. 허용 가능한 정밀도로 int 또는 uint로 변환 할 수 없습니다. –