IT story

"벡터화"란 무엇입니까?

hot-time 2020. 6. 14. 09:51
반응형

"벡터화"란 무엇입니까?


몇 번이나, 나는 matlab, fortran ...에서 다른 용어를 만났습니다 ...하지만 다른 것은 ... 그것이 무엇을 의미하는지, 그리고 그것이 무엇을 의미하는지 설명을 찾지 못했습니다. 여기에 묻습니다. 벡터화 란 무엇입니까? 예를 들어 "루프가 벡터화 됨"이란 무엇입니까?


많은 CPU에는 "벡터"또는 "SIMD"명령 세트가 있으며이 명령 세트는 2 개, 4 개 이상의 데이터 조각에 동시에 동일한 작업을 적용합니다. 최신 x86 칩에는 SSE 명령이 있고 많은 PPC 칩에는 "Altivec"명령이 있으며 일부 ARM 칩에도 NEON이라는 벡터 명령 세트가 있습니다.

"벡터화"(단순화)는 루프의 재 작성 프로세스로서, 어레이의 단일 요소를 N 회 처리하는 대신, 어레이의 4 개의 요소를 동시에 N / 4 배 처리한다.

(저는 현대 하드웨어가 직접 지원할 가능성이 가장 높기 때문에 4를 선택했습니다. "벡터화"라는 용어는 루프를 완전히 추상화하고 요소 대신 배열에서의 작동을 설명하는 고급 소프트웨어 변환을 설명하는 데에도 사용됩니다. 그들을 구성하는)


벡터화와 루프 언 롤링의 차이점 : 두 배열의 요소를 추가하고 결과를 세 번째 배열에 저장하는 다음과 같은 매우 간단한 루프를 고려하십시오.

for (int i=0; i<16; ++i)
    C[i] = A[i] + B[i];

이 루프를 풀면 다음과 같이 변환됩니다.

for (int i=0; i<16; i+=4) {
    C[i]   = A[i]   + B[i];
    C[i+1] = A[i+1] + B[i+1];
    C[i+2] = A[i+2] + B[i+2];
    C[i+3] = A[i+3] + B[i+3];
}

반면에 벡터화하면 다음과 같이 생성됩니다.

for (int i=0; i<16; i+=4)
    addFourThingsAtOnceAndStoreResult(&C[i], &A[i], &B[i]);

여기서 "addFourThingsAtOnceAndStoreResult"는 컴파일러가 벡터 명령어를 지정하는 데 사용하는 내장 함수에 대한 자리 표시 자입니다. 일부 컴파일러는 이와 같은 매우 간단한 루프 자동 벡터화 할 수 있으며, 종종 컴파일 옵션을 통해 활성화 될 수 있습니다. 더 복잡한 알고리즘은 여전히 ​​좋은 벡터 코드를 생성하기 위해 프로그래머의 도움이 필요합니다.


벡터화는 스칼라 프로그램을 벡터 프로그램으로 변환하는 용어입니다. 벡터화 된 프로그램은 단일 명령어에서 여러 연산을 실행할 수있는 반면 스칼라는 한 번에 피연산자 쌍에서만 작동 할 수 있습니다.

에서 위키 피 디아 :

스칼라 접근법 :

for (i = 0; i < 1024; i++)
{
   C[i] = A[i]*B[i];
}

벡터화 된 접근 방식 :

for (i = 0; i < 1024; i+=4)
{
   C[i:i+3] = A[i:i+3]*B[i:i+3];
}

단일 단계에서 숫자의 목록 또는 "벡터"에 대해 단일 수학 연산을 수행하는 기능을 나타냅니다. 과학적 컴퓨팅과 관련이 있기 때문에 Fortran에서 자주 볼 수 있습니다. 과학 컴퓨팅은 수퍼 컴퓨팅과 관련이 있으며 벡터화 된 산술이 처음 나타납니다. 오늘날 거의 모든 데스크탑 CPU는 인텔의 SSE와 같은 기술을 통해 어떤 형태의 벡터화 된 산술을 제공합니다. GPU는 또한 벡터화 된 산술 형식을 제공합니다.


벡터화 는 많은 양의 데이터를 효율적으로 처리해야하는 과학 컴퓨팅에 크게 사용됩니다.

실제 프로그래밍 응용 프로그램에서는 NUMPY에서 사용된다는 것을 알고 있습니다 (다른 확실하지 않음).

Numpy (python의 과학 컴퓨팅 패키지) 는 n 차원 배열의 빠른 조작을 위해 벡터화사용하며 , 일반적으로 배열 처리를 위해 내장 된 python 옵션으로 수행하면 속도가 느려집니다.

설명의 톤이 출력되지만, 여기에 무엇 벡터화 정의 AS IN NumPy와 도움말 페이지

벡터화는 코드에 명시 적 루핑, 인덱싱 등이 없음을 설명합니다. 물론 이러한 작업은 최적화 된 사전 컴파일 된 C 코드에서 "뒤에서"발생합니다. 벡터화 된 코드에는 다음과 같은 많은 장점이 있습니다.

  1. 벡터화 된 코드가 더 간결하고 읽기 쉽습니다

  2. 적은 코드 줄은 일반적으로 더 적은 버그를 의미합니다.

  3. 이 코드는 표준 수학 표기법과 더 유사합니다 (일반적으로 수학 구문을 올바르게 코딩하는 것이 더 쉬워 짐)

  4. 벡터화는 더 많은 "Pythonic"코드를 생성합니다. 벡터화가 없으면 코드가 비효율적이며 for 루프를 읽기 어려워집니다.


간단히 말하면 벡터화는 알고리즘을 최적화하여 프로세서에서 SIMD 명령어를 활용할 수 있음을 의미합니다.

AVX, AVX2 and AVX512 are the instruction sets (intel) that perform same operation on multiple data in one instruction. for eg. AVX512 means you can operate on 16 integer values(4 bytes) at a time. What that means is that if you have vector of 16 integers and you want to double that value in each integers and then add 10 to it. You can either load values on to general register [a,b,c] 16 times and perform same operation or you can perform same operation by loading all 16 values on to SIMD registers [xmm,ymm] and perform the operation once. This lets speed up the computation of vector data.

In vectorization we use this to our advantage, by remodelling our data so that we can perform SIMD operations on it and speed up the program.

Only problem with vectorization is handling conditions. Because conditions branch the flow of execution. This can be handled by masking. By modelling the condition into an arithmetic operation. eg. if we want to add 10 to value if it is greater then 100. we can either.

if(x[i] > 100) x[i] += 10; // this will branch execution flow.

or we can model the condition into arithmetic operation creating a condition vector c,

c[i] = x[i] > 100; // storing the condition on masking vector
x[i] = x[i] + (c[i] & 10) // using mask

this is very trivial example though... thus, c is our masking vector which we use to perform binary operation based on its value. This avoid branching of execution flow and enables vectorization.

Vectorization is as important as Parallelization. Thus, we should make use of it as much possible. All modern days processors have SIMD instructions for heavy compute workloads. We can optimize our code to use these SIMD instructions using vectorization, this is similar to parrallelizing our code to run on multiple cores available on modern processors.

I would like to leave with the mention of OpenMP, which lets yo vectorize the code using pragmas. I consider it as a good starting point. Same can be said for OpenACC.


See the two answers above. I just wanted to add that the reason for wanting to do vectorization is that these operations can easily be performed in paraell by supercomputers and multi-processors, yielding a big performance gain. On single processor computers there will be no performance gain.

참고URL : https://stackoverflow.com/questions/1422149/what-is-vectorization

반응형