2016-08-17 2 views
0

.metal 파일에 다음 구조체 가정 해 보겠습니다 내가 한 :은 금속 구조체의 상처 성능에 사용되지 않는 특성을 수행

struct VertexOut{ 
    float4 position [[position]]; 
    float2 a; 
    float2 b; 
}; 

이 구조체는 내 조각 쉐이더에 대한 [[ stage-in ]] 입력합니다. 이제 일부 셰이더는 b을 사용하고 일부는 사용하지 않습니다. 이 성능을 전혀 상하게합니까? 즉, 필요하지 않은 셰이더에 b없이 다른 구조체를 생성해야합니까?

+0

미사용 속성에만 악영향을 미친다는 것은 버퍼에 복사해야 할 낭비되는 메모리라는 것입니다. 그것 이외에 나는 그것으로 문제를 볼 수 없다. 이걸 100 %하지는 않았지만 소금 한 덩어리로 가져 가라. –

답변

0

답변은 사용법에 따라 다릅니다. 메모리 대역폭 성능이 저하되지만 상당히 작습니다. 이 셰이더를 사용하여 픽셀의 전체 화면을 출력하는 경우 대역폭이 제한되어 있으면 불필요한 float2를 제거하십시오 도움이 될 수 있습니다.

그러나 셰이더를 변경하면 성능이 저하되는 경우가 많으므로 손실을 훨씬 능가하는 조각 셰이더를 변경할 필요가 없어 성능이 향상 될 수 있습니다.

한 가지 제안은 a와 b를 float4 a_b으로 변경하고 a_b.xya_b.zw으로 액세스하는 것입니다. 레지스터는 16 바이트로 정렬되므로 공간을 절약 할 수 있습니다. 예를 보자

struct X { float4 position; float2 a; float2 b; }; struct Y { float4 position; float2 a; }; struct Z { float4 position; float4 a_b; };

상기 경우에서, X는 48 바이트를 사용하는 Y 반면 (도 16 바이트마다 3 개 레지스터 임) 또는 Z는 32 바이트 (2 개 레지스터가있다)이다. 그래서 Z를 사용하면 잠재적으로 여러분에게 두 세계의 장점을 줄 것입니다.