룩업 테이블
Lookup table컴퓨터 과학에서 룩업 테이블(LUT)은 런타임 계산을 보다 단순한 배열 인덱싱 작업으로 대체하는 배열입니다.이 프로세스를 "다이렉트어드레싱"이라고 부릅니다.LUT는 테이블과 다릅니다.즉, 키k(\ k를 하여 v를 취득하기 위해 해시 은 슬롯h에 값 v(\ h를 저장합니다.서 h h는 해시 함수입니다.k는 슬롯 계산에 사용되며 LUT의 경우 v는 kk에 저장되므로 직접 주소를 지정할 [1]: 466 수 있습니다.메모리로부터 값을 취득하는 것이, 「비용이 많이 드는」연산이나 입출력 [2]조작을 실행하는 것보다 고속인 경우가 많기 때문에, 처리 시간을 큰폭으로 절약할 수 있습니다.테이블은 미리 계산되어 정적 프로그램 스토리지에 저장되거나 프로그램의 초기화 단계(메모화)의 일부로 계산(또는 "프리페치")되거나 애플리케이션별 플랫폼의 하드웨어에 저장될 수도 있습니다.룩업 테이블은 배열 내의 유효(또는 무효) 항목 목록과 대조하여 입력값을 검증하기 위해 광범위하게 사용되며, 일부 프로그래밍 언어에서는 일치하는 입력을 처리하기 위한 포인터 함수(또는 라벨 오프셋)를 포함할 수 있습니다.또한 FPGA는 재구성 가능한 하드웨어 구현 룩업 테이블을 광범위하게 사용하여 프로그램 가능한 하드웨어 기능을 제공합니다.
역사
컴퓨터가 등장하기 전에는 삼각함수, 로그, 통계밀도함수와 같은 복잡한 [3]함수의 수동 계산 속도를 높이기 위해 값의 룩업 테이블이 사용되었습니다.
고대(AD 499년) 인도에서 아리아바타는 최초의 사인표를 만들었고, 그는 그것을 산스크리트 문자 기반의 숫자 체계로 인코딩했습니다.493AD에서 Victorius 아키텐의(로마 숫자로)2에서 50번이나 줄에 모든 숫자의 제품을98-column 곱셈 표 M."숫자 목록을 천과, 수백명에 의해서 100살까지 내려오는, 수만명이 10, 그 다음에 것들에 의해 하나로 변환한 다음, 분수를 1/144기 시작"[4] 있었다고 썼다오드ern 학교 아이들은 가장 일반적으로 사용되는 숫자의 계산을 피하기 위해 종종 "시간표"를 외우는 것을 배운다(9 x 9 또는 12 x 12까지).
컴퓨터의 역사 초기에 입출력 동작은 당시의 프로세서 속도에 비해 특히 느렸습니다.가장 일반적으로 발생하는 데이터 항목만 포함하는 정적 룩업 테이블(프로그램에 내장) 또는 동적 프리페치 어레이를 생성하여 수동 캐싱의 형태로 고가의 읽기 작업을 줄이는 것이 타당했습니다.이제 이 프로세스를 자동화하는 시스템 전체 캐싱이 도입되었지만, 애플리케이션 수준 조회 테이블은 거의 변경되지 않는 데이터 항목의 성능을 개선할 수 있습니다.
룩업 테이블은 컴퓨터 스프레드시트에 구현된 최초의 기능 중 하나이며 VisiCalc(1979)의 초기 버전은 다음과 같습니다.LOOKUP
본래의 20개의 [5]기능 중에서 기능합니다.그 후 Microsoft Excel 등의 후속 스프레드시트가 제공되어 전문 스탭으로 보완되고 있습니다.VLOOKUP
그리고.HLOOKUP
수직 또는 수평 테이블에서 검색을 단순화하는 기능을 제공합니다.Microsoft Excel에서는XLOOKUP
이 기능은 2019년 8월 28일부터 배포되었습니다.
제한 사항
LUT의 퍼포먼스는 룩업 조작에 1 {\(1이지만, 2개의 엔티티 또는 값에는 동일한 k(\ k를 사용할 수 없습니다.키가 그려진 우주 크기가 크면 메모리에 저장할 수 없거나 현실적이지 않을 수 있습니다.따라서 이 경우 해시 테이블을 사용하는 [1]: 468 것이 좋습니다.
예
Trivial 해시 함수
단순 해시 함수 룩업에서는 부호 없는 원시 데이터 값을 직접 1차원 테이블에 대한 인덱스로 사용하여 결과를 추출한다.작은 범위의 경우 분기 수가 0인 이진 검색 속도를 초과하고 일정한 [6]시간에 실행되는 등 가장 빠른 검색 속도 중 하나입니다.
일련의 바이트의 비트 카운트
많은 컴퓨터에서 해결하는데 비용이 많이 드는 한 가지 이산적인 문제는 (2진수) 숫자에서 1로 설정된 비트 수를 세는 것입니다. 때로는 모집단 함수라고도 합니다.예를 들어, 10진수 "37"은 이진수 "00100101"이므로 이진수 "1"[7]: 282 로 설정된 3비트가 포함됩니다.
int 내의 1비트를 카운트하도록 설계된 C 코드의 간단한 예는 다음과 같습니다.[7]: 283
인트 카운트_1(서명되어 있지 않다 인트 x) { 인트 결과 = 0; 하는 동안에 (x != 0) { x = x & (x - 1); 결과++; } 돌아가다 결과; }
상기의 실장에서는, 32비트치를 평가하려면 , 32개의 연산이 필요합니다.브런치 때문에 클럭 사이클이 몇개인가 걸릴 가능성이 있습니다.룩업 테이블로 "언롤"할 수 있으며,[7]: 282-283 룩업 테이블은 성능 향상을 위해 사소한 해시 함수를 사용합니다.
비트 배열, 256개의 엔트리가 있는 bits_set은 가능한 각 바이트 값에 설정된 1개의 비트 수(예: 0x00 = 0, 0x01 = 1, 0x02 = 1 등)를 지정하여 구성됩니다.런타임 알고리즘을 사용하여 bits_set 배열을 생성할 수 있지만 크기를 고려할 때 클럭 사이클의 비효율적인 사용입니다.따라서 컴파일 시간 스크립트를 사용하여 테이블을 동적으로 생성하여 소스 파일에 추가할 수 있습니다.각 바이트에 대한 사소한 해시함수 조회를 통해 정수의 각 바이트에 대한 1의 합을 계산할 수 있으므로 분기를 효과적으로 회피할 수 있어 [7]: 284 성능이 크게 향상된다.
인트 카운트_1(인트 input_value 값) { 조합 4바이트 { 인트 big_int; 차 각 바이트[4]; } 오퍼랜드 = input_value 값; 컨스턴트 인트 비트 세트[256] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8}; 돌아가다 (비트 세트[오퍼랜드.각 바이트[0]] + 비트 세트[오퍼랜드.각 바이트[1]] + 비트 세트[오퍼랜드.각 바이트[2]] + 비트 세트[오퍼랜드.각 바이트[3]]); }}
이미지 처리 시 조회 테이블
화상 처리등의 데이터 해석 애플리케이션에서는, 룩업 테이블(LUT)을 사용해 입력 데이터를 보다 바람직한 출력 포맷으로 변환한다.예를 들어, 토성의 회색조 사진은 고리의 차이를 강조하기 위해 컬러 이미지로 변환됩니다.
룩업 테이블을 사용하여 런타임 계산을 줄이는 전형적인 예는 값의 사인 등의 삼각 계산 결과를 얻는 것입니다.삼각함수를 계산하면 계산 어플리케이션이 상당히 느려질 수 있습니다.예를 들어 각 도수에 대해 여러 값의 사인(sine)을 먼저 계산할 때 동일한 응용 프로그램이 훨씬 더 빨리 완료될 수 있습니다(테이블을 컴파일 시 정적 변수로 정의하여 반복 실행 시간 비용을 줄일 수 있습니다).프로그램에 값의 사인(sine)이 필요한 경우 조회 테이블을 사용하여 메모리 주소에서 가장 가까운 사인(sine) 값을 검색할 수 있으며, 수학 공식으로 계산하는 대신 원하는 값의 사인(sine)에 보간할 수도 있습니다.따라서 룩업 테이블은 컴퓨터 시스템의 수학 보조 프로세서에 의해 사용됩니다.룩업 테이블의 에러는 인텔의 악명 높은 부동 소수점 분할 버그의 원인입니다.
단일 변수(사인 및 코사인 등)의 함수는 단순 배열로 구현할 수 있습니다.두 개 이상의 변수를 포함하는 함수에는 다차원 배열 인덱싱 기술이 필요합니다.따라서 후자의 경우 x와 y 값의 제한된 범위에 대해 x를 계산하는y 함수를 대체하기 위해 2차원 배열을 사용할 수 있습니다.결과가 둘 이상인 함수는 구조 배열인 조회 테이블을 사용하여 구현할 수 있습니다.
전술한 바와 같이, 표를 소량의 계산과 조합하여 사용하는 중간 솔루션이 있으며, 종종 보간법을 사용한다.사전 계산과 보간법을 조합하면 사전 계산된 두 값 사이에 있는 값에 대해 더 높은 정확도를 얻을 수 있습니다.이 기술은 실행하는 데 시간이 조금 더 걸리지만 더 높은 정확도를 필요로 하는 애플리케이션에서 정확도를 크게 높일 수 있습니다.사전 계산되는 값에 따라 정확성을 유지하면서 검색 테이블 크기를 축소하기 위해 보간 기능이 있는 사전 계산을 사용할 수도 있습니다.
이미지 처리에서 룩업테이블은 종종 LUT(또는 3DLUT)라고 불리며 인덱스 값의 각 범위에 대한 출력값을 제공합니다.colormap 또는 palette라고 불리는 하나의 공통 LUT를 사용하여 특정 이미지를 표시할 색상과 강도 값을 결정합니다.컴퓨터 단층촬영에서 "창"은 측정된 방사선의 강도를 표시하는 방법을 결정하기 위한 관련 개념을 말한다.
LUT가 대체하는 계산이 비교적 단순할 경우 룩업테이블을 사용하는 것은 종종 효과적이지만 심각한 패널티를 초래할 수 있습니다.메모리 검색 시간과 메모리 요건의 복잡성으로 인해 애플리케이션 동작 시간과 시스템의 복잡성이 직선 공식 연산에 비해 증가할 수 있습니다.캐시를 오염시킬 가능성도 문제가 될 수 있습니다.큰 테이블의 테이블접근은 캐시 미스의 원인이 될 가능성이 거의 확실합니다.이 현상은 프로세서가 메모리를 앞지르면서 점점 더 문제가 되고 있습니다.컴파일러의 최적화인 재소재화에서도 같은 문제가 발생합니다.Java 프로그래밍 언어와 같은 일부 환경에서는 각 룩업에 대한 추가 비교 및 분기를 수반하는 필수 경계 검사로 인해 테이블 룩업이 훨씬 더 비싸질 수 있습니다.
필요한 작업에 대한 룩업 테이블을 생성할 수 있는 시기에는 두 가지 기본적인 제한이 있습니다.하나는 사용 가능한 메모리의 양입니다.검색 시간을 들여 디스크 기반 룩업테이블을 작성할 수는 있지만 테이블에서 사용할 수 있는 공간보다 큰 룩업테이블을 작성할 수는 없습니다.다른 하나는 첫 번째 인스턴스에서 테이블 값을 계산하는 데 필요한 시간입니다. 보통 이 작업은 한 번만 수행하면 되지만 시간이 너무 오래 걸리면 룩업 테이블을 사용하는 것이 부적절한 솔루션이 될 수 있습니다.그러나 앞에서 설명한 바와 같이 테이블은 많은 경우 정적으로 정의될 수 있습니다.
컴퓨팅 사인
대부분의 컴퓨터는 기본적인 산술 연산만 수행하며 주어진 값의 사인을 직접 계산할 수 없습니다.대신 CORDIC 알고리즘 또는 다음 Taylor 시리즈와 같은 복잡한 공식을 사용하여 높은 [8]: 5 정밀도로 사인 값을 계산합니다.
- ( ) - + - 7 {} ( ) \ x - { \ {x^ { } { } + { \ {x 5 { } - { \ { x { 50 }} } ( x 0 )
그러나 이것은 특히 느린 프로세서에서는 계산 비용이 많이 들 수 있으며, 특히 기존의 컴퓨터 그래픽스에서는 매초 수천 개의 사인 값을 계산해야 하는 응용 프로그램이 많이 있습니다.일반적인 해결책은 처음에 균등하게 분포된 많은 값의 사인을 계산한 다음 x의 사인을 찾기 위해 배열 인덱싱 작업을 통해 x에 가장 가까운 값의 사인을 선택하는 것입니다.사인파(sine)는 [8]: 6 변화율이 제한된 연속 함수이기 때문에 올바른 값에 가깝습니다.예를 [9]: 545-548 들어 다음과 같습니다.
진짜 배열 사인 테이블[-1000..1000] 위해서 x 부터 -1000 로. 1000 사인 테이블[x] = 사인(파이 * x / 1000) 기능. lookup_module(x) 돌아가다 사인 테이블[둥글다(1000 * x / 파이)]
안타깝게도 테이블에는 꽤 많은 공간이 필요합니다.IEEE 배정밀 부동소수점 숫자가 사용되는 경우 16,000바이트가 넘는 공간이 필요합니다.더 적은 샘플을 사용할 수 있지만, 그렇게 되면 정밀도가 크게 떨어집니다.좋은 해결책 중 하나는 선형 보간으로, 값의 양쪽에 있는 표의 두 점 사이에 선을 긋고 그 선 위에 답을 찾는 것입니다.이는 여전히 계산 속도가 빠르며 사인 함수와 같은 부드러운 함수의 경우 훨씬 정확합니다.다음은 선형 보간을 사용한 예입니다.
기능. lookup_module(x) x1 = 바닥.(x*1000/파이) y1 = 사인 테이블[x1] y2 = 사인 테이블[x1+1] 돌아가다 y1 + (y2-y1)*(x*1000/파이-x1)
선형 보간은 연속적이지만 일반적으로 연속 도함수를 가지지 않는 보간 함수를 제공합니다.연속적이고 1차 도함수가 연속적인 테이블 룩업을 보다 원활하게 보간하려면 입방체 에르미트 스플라인을 사용해야 합니다.
공간의 4분의 1을 사용하지만 계산하는 데 시간이 좀 더 걸리는 또 다른 솔루션은 대칭 규칙과 함께 사인 및 코사인 간의 관계를 고려하는 것입니다.이 경우 조회 테이블은 첫 번째 사분면에 대한 사인 함수(즉, sin(0..pi/2))를 사용하여 계산됩니다.값이 필요한 경우 변수를 첫 번째 사분면에 감싼 각도로 할당합니다.그런 다음 4개 사분면에 대한 각도를 정리하고(값이 항상 0과 2*pi 사이인 경우 필요하지 않음), 정확한 값을 반환합니다(즉, 첫 번째 사분면은 직선 반환, 두 번째 사분면은 pi/2-x에서 읽음, 세 번째 사분면은 첫 번째와 두 번째 사분면에 대한 음수).코사인에서는 pi/2만큼 이동한 각도(즉, x+pi/2)만 반환하면 됩니다.탄젠트의 경우 사인(sine)을 코사인(cosine)으로 나눕니다(구현에 따라 0으로 나눕니다).
기능. init_interface() 위해서 x 부터 0 로. (360/4)+1 사인 테이블[x] = 죄(2*파이 * x / 360) 기능. lookup_module(x) x = 싼다 x 부터 0 로. 360 y = 모드 (x, 90) 한다면 (x < > 90) 돌아가다 사인 테이블[ y] 한다면 (x < > 180) 돌아가다 사인 테이블[90-y] 한다면 (x < > 270) 돌아가다 -사인 테이블[ y] 돌아가다 -사인 테이블[90-y] 기능. lookup_cosine(x) 돌아가다 lookup_module(x + 90) 기능. lookup_tan(x) 돌아가다 lookup_module(x) / lookup_cosine(x)
보간법을 사용할 경우 불균일한 샘플링을 사용하여 룩업 테이블의 크기를 줄일 수 있습니다. 즉, 함수가 직선에 가까운 경우에는 샘플 포인트를 거의 사용하지 않지만 값이 빠르게 변경되는 경우에는 더 많은 샘플 포인트를 사용하여 근사치를 실제 곡선에 가깝게 유지할 수 있습니다.자세한 내용은 보간법을 참조하십시오.
룩업 테이블의 기타 용도
캐시
스토리지 캐시(파일용 디스크 캐시 또는 코드 또는 데이터용 프로세서 캐시 포함)도 룩업 테이블과 같이 작동합니다.테이블은 저속 외부 메모리에 저장되는 대신 매우 빠른 메모리를 사용하여 구축되며 외부 메모리(또는 디스크) 주소를 구성하는 하위 범위의 비트에 대해 두 개의 데이터를 유지합니다(특히 가능한 외부 주소 중 가장 낮은 비트).
- 1개(태그)에는 주소의 나머지 비트 값이 포함됩니다.이러한 비트가 메모리주소의 비트값과 일치하면, 다른 쪽에는 이 주소의 캐시된 값이 포함됩니다.
- 다른 하나는 해당 주소에 관련된 데이터를 유지합니다.
원하는 외부 스토리지 주소의 최하위 비트로 지정된 인덱스로 룩업 테이블 내의 태그를 읽어내고 메모리 주소가 캐시에 히트하고 있는지 여부를 판단하기 위해 단일(고속) 룩업을 실행한다.히트가 발견되면 외부 메모리에 액세스할 필요가 없습니다(기입 조작을 제외하고, 캐시된 값을 느린 메모리로 비동기적으로 업데이트해야 하거나 다른 주소를 캐시하기 위해 캐시 내의 위치를 교체해야 하는 경우).
하드웨어 LUT
디지털 로직에서 룩업 테이블은 주소 신호에 의해 선택 라인이 구동되고 입력이 어레이에 포함되는 요소의 값인 멀티플렉서로 구현될 수 있다.이러한 값은 기능 고유의 용도를 가진 ASIC에서와 같이 유선 연결하거나 설정 가능한 값을 허용하는D 래치로 제공할 수 있습니다(ROM, EPROM, EEPROM 또는 RAM).
n비트 LUT는 함수의 진실 테이블을 LUT에 저장함으로써 임의의 n입력 부울 함수를 부호화할 수 있습니다.이는 부울 로직 함수를 효율적으로 인코딩하는 방법으로, 4 ~6비트의 입력을 가진 LUT는 실제로는 재구성 가능한 하드웨어 로직 기능을 제공하는 최신 Field-Programmable Gate Array(FPGA; 필드 프로그래머블게이트 어레이)의 주요 컴포넌트입니다.
데이터 수집 및 제어 시스템
데이터 수집 및 제어 시스템에서 룩업 테이블은 일반적으로 다음 작업을 수행하기 위해 사용됩니다.
일부 시스템에서는 이러한 계산을 위해 룩업 테이블 대신 다항식을 정의할 수도 있습니다.
「 」를 참조해 주세요.
- 연관 배열
- 브랜치 테이블
- Gal의 정확한 표
- 메모화
- 메모리 바인딩 함수
- 시프트 레지스터 조회 테이블
- 팔레트(컬러 룩업 테이블 또는 CLUT)– 컴퓨터 그래픽스에서의 사용
- 3D 룩업 테이블– 영화 산업에서의 사용
레퍼런스
- ^ a b Kwok, W.; Haghighi, K.; Kang, E. (1995). "An efficient data structure for the advancing-front triangular mesh generation technique". Communications in Numerical Methods in Engineering. Wiley & Sons. 11 (5): 465–473. doi:10.1002/cnm.1640110511.
- ^ McNamee, Paul (21 August 1998). "Automated Memoization in C++". Archived from the original on 16 April 2019.
{{cite web}}
: CS1 유지보수: 부적합한 URL(링크) - ^ Campbell-Kelly, Martin; Croarken, Mary; Robson, Eleanor, eds. (2003). The History of Mathematical Tables: From Sumer to Spreadsheets. Oxford University Press.
- ^ 마허, 데이비드W. J.와 John F.마코프스키."분수를 사용한 로마 산술의 문헌 증거", "고전 언어학"(2001) 제96권 제4호(2001) 페이지 376-399. (383페이지 참조)
- ^ Bill Jelen: "1979년부터 – VisiCalc와 Lookup!" (미스터Excel East, 2012년 3월 31일)
- ^ Cormen, Thomas H. (2009). Introduction to algorithms (3rd ed.). Cambridge, Mass.: MIT Press. pp. 253–255. ISBN 9780262033848. Retrieved 26 November 2015.
- ^ a b c d Jungck P.; Dencan R.; Mulcahy D. (2011). Developing for Performance. In: packetC Programming. Apress. doi:10.1007/978-1-4302-4159-1_26. ISBN 978-1-4302-4159-1.
- ^ a b Sharif, Haidar (2014). "High-performance mathematical functions for single-core architectures". Journal of Circuits, Systems and Computers. World Scientific. 23 (4). doi:10.1142/S0218126614500510.
- ^ Randall Hyde (1 March 2010). The Art of Assembly Language, 2nd Edition (PDF). No Starch Press. ISBN 978-1593272074 – via University of Campinas Institute of Computing.
외부 링크
- 입력 문자를 분기 테이블의 인덱스로 사용하여 빠른 테이블 검색
- 조립 기술: 테이블 조회를 통한 계산
- 스탠포드 대학의 Sean Eron Anderson의 "Bit Twiddling Hacks"(룩업 테이블 포함)
- 절약을 나타내는 Paul McNamee의 C++ 메모
- Henry S의 "가속된 인구수를 위한 탐색"워렌 주니어