2013-07-27 6 views
0

아래 코드는 8 비트 팔레 타이 징 형식에서 32-RGBA 행을 변환합니다.ARM의 스캔 라인 변환 함수 최적화

구현하기 전에 아래 코드가 Direct-Math 또는 ARM Neon intrinsics 또는 인라인 어셈블리로 최적화하는 데 적합한 지 알고 싶습니다. 문서를 처음 보았을 때 테이블 룩업 부분을 덮을만한 내용은 없었습니다.

void CopyPixels(BYTE *pDst, BYTE *pSrc, int width, 
    const BYTE mask, Color* pColorTable) 
{ 
    if (width) 
    { 
    do 
    { 
     BYTE b = *pSrc++; 
     if (b != mask) 
     { 
     // Translate to 32-bit RGB value if not masked 
     const Color* pColor = pColorTable + b; 
     pDst[0] = pColor->Blue; 
     pDst[1] = pColor->Green; 
     pDst[2] = pColor->Red; 
     pDst[3] = 0xFF; 
     } 
     // Skip to next pixel 
     pDst += 4; 
    } 
    while (--width); 
    } 
} 
+1

테이블에 대한 액세스는 단지 * 메모리 * 작업입니다. 그것은 테이블 형식에 따라 다릅니다. * NEON *을 사용하면'vld' 만 사용하면됩니다. 주문을 다시해야하는 경우 많은 옵션이 있습니다. 예를 들어, [벡터 재배치 블로그] (http://blogs.arm.com/software-enablement/684-coding-for-neon-part-5-rearranging-vectors/). –

+0

컬러 맵에 무엇이 있는지 알고 있습니까? 예상되는 작업을 피하고 시간을 절약하면서 근사치를 구할 수 있지만 알려진지도에 대해서만 실행할 수 있습니다. – sh1

답변

3

크기가 256 * 4bytes = 1024byte 인 LUT가 필요합니다. 이러한 종류의 작업은 SIMD에 전혀 적합하지 않습니다. (Intel의 새 Haswell 코어에서 SSE 부분 제외)

NEON은 VTBL 및 VTBX를 사용하여 최대 32 바이트 크기의 LUT를 처리 할 수 ​​있지만, Newton-Raphson 반복의 시작 값으로 CLZ와 함께 사용하기 위해 다소 의미가 있습니다 .

1

Jake와는 큰 벡터 프로세서 문제가 아니므로 ARM 메인 파이프 라인에서보다 효율적으로 처리 할 수 ​​있습니다. 그렇다고 어셈블리를 통해 최적화 할 수는 없지만 (즉 단순한 ARM v7) 결과가 크게 향상되었습니다.

특히 간단한 개선은 단어 크기로 복사 할 수 있도록 조회 테이블을 작성하는 것입니다. 이는 Color 구조체가 32-RGBA 형식을 따르는 지 확인하는 것입니다 (룩업의 일부로 4 번째 0xFF를 포함하여 단일 단어 복사 만 할 수 있음). 이는 어셈블리가 필요하지 않은 상태에서 성능이 크게 향상 될 수 있습니다. 이는 3 개가 아닌 단일 메모리 페치이기 때문입니다 (상수 할당 포함).

void CopyPixels(RGBA32Color *pDst, BYTE const *pSrc, int width, 
    const BYTE mask, RGBA32Color const *pColorTable) 
{ 
    if (width) 
    { 
    do 
    { 
     BYTE b = *pSrc++; 
     if (b != mask) 
     { 
     // Translate to 32-bit RGB value if not masked 
     *pDst = pColorTable[b]; 
     } 
     // Skip to next pixel 
     pDst ++; 
    } 
    while (--width); 
    } 
}