문제

지금까지 Matlab, Fortran에서 이 용어를 여러 번 접했습니다.다른 ...하지만 나는 그것이 무엇을 의미하고 무엇을 하는지 설명을 찾지 못했습니다.그래서 저는 여기서 벡터화란 무엇인지 묻고 있습니다. 예를 들어 "루프가 벡터화되었습니다"라는 것은 무엇을 의미합니까?

도움이 되었습니까?

해결책

많은 CPU에는 2개, 4개 또는 그 이상의 데이터에 동일한 작업을 동시에 적용하는 "벡터" 또는 "SIMD" 명령어 세트가 있습니다.최신 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- 차원 배열의 빠른 조작을 위해, 배열을 처리하기위한 내장 된 파이썬 옵션으로 완료되면 일반적으로 느리게됩니다.

많은 설명이 있지만 여기에 벡터화 로 정의됩니다 Numpy 문서 페이지

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

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

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

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

  4. 벡터화는 더 많은 "pythonic"코드를 초래합니다. 벡터화가 없으면 코드는 비효율적이고 루프를 읽기가 어렵습니다.

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

AVX, AVX2 및 AVX512는 하나의 명령으로 여러 데이터에 대해 동일한 작업을 수행하는 명령 세트(인텔)입니다.예를 들어.AVX512는 한 번에 16개의 정수 값(4바이트)을 처리할 수 있음을 의미합니다.이것이 의미하는 바는 16개의 정수로 구성된 벡터가 있고 각 정수의 해당 값을 두 배로 늘리고 여기에 10을 더하려는 경우입니다.일반 레지스터 [a,b,c]에 16번 값을 로드하고 동일한 작업을 수행하거나 SIMD 레지스터 [xmm,ymm]에 16개 값을 모두 로드하고 해당 작업을 한 번 수행하여 동일한 작업을 수행할 수 있습니다.이를 통해 벡터 데이터의 계산 속도를 높일 수 있습니다.

벡터화에서는 데이터를 리모델링하여 SIMD 작업을 수행하고 프로그램 속도를 높이는 등 이를 활용합니다.

벡터화의 유일한 문제는 처리 조건입니다.조건이 실행 흐름을 분기하기 때문입니다.이는 마스킹을 통해 처리할 수 있습니다.조건을 산술 연산으로 모델링합니다.예.100보다 큰 값에 10을 더하고 싶다면우리도 할 수 있어요.

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

또는 조건 벡터 c를 생성하는 산술 연산으로 조건을 모델링할 수 있습니다.

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

이것은 매우 사소한 예이지만 ...따라서 c는 해당 값을 기반으로 이진 연산을 수행하는 데 사용하는 마스킹 벡터입니다.이렇게 하면 실행 흐름의 분기가 방지되고 벡터화가 가능해집니다.

벡터화는 병렬화만큼 중요합니다.그러므로 우리는 그것을 최대한 활용해야 한다.모든 최신 프로세서에는 과도한 컴퓨팅 작업 부하에 대한 SIMD 지침이 있습니다.벡터화를 사용하여 이러한 SIMD 명령어를 사용하도록 코드를 최적화할 수 있습니다. 이는 최신 프로세서에서 사용 가능한 여러 코어에서 실행되도록 코드를 병렬화하는 것과 유사합니다.

pragma를 사용하여 코드를 벡터화할 수 있는 OpenMP에 대해 언급하고 싶습니다.나는 그것이 좋은 출발점이라고 생각합니다.OpenACC에서도 마찬가지입니다.

위의 두 가지 답변을 참조하십시오. 벡터화를 원하는 이유는 슈퍼 컴퓨터와 다중 프로세서가 Paraell에서 쉽게 수행 할 수있어 성능이 큰 이익을 얻을 수 있기 때문이라고 덧붙였습니다. 단일 프로세서 컴퓨터에는 성능 게인이 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top