programing

벡터화는 무엇을 의미합니까?

javamemo 2023. 6. 24. 08:42
반응형

벡터화는 무엇을 의미합니까?

코드를 벡터화하는 것이 좋은 생각입니까?언제 그것을 해야 하는지에 대한 좋은 관행은 무엇입니까?밑에 무슨 일이 일어날까요?

벡터화는 컴파일러가 사용자의 독립적인 명령어가 하나의 SIMD 명령어로 실행될 수 있음을 감지함을 의미합니다.일반적인 예는 만약 당신이 무언가를 한다면.

for (i = 0; i < N; i++) {
    a[i] = a[i] + b[i];
}

(벡터 표기법을 사용하여) 다음과 같이 벡터화됩니다.

for (i = 0; i < (N - N % VF); i += VF) {
    a[i : i + VF] = a[i : i + VF] + b[i : i + VF];
}

기본적으로 컴파일러는 어레이의 VF 요소에서 동시에 수행할 수 있는 작업을 하나 선택하고 단일 작업을 N번 수행하는 대신 해당 작업을 N번 수행합니다.

성능은 향상되지만 아키텍처에 더 많은 요구사항이 있습니다.

위에서 언급한 바와 같이 벡터화는 대형 레지스터에 패킹된 서로 다른 데이터의 동일한 작업을 수행할 수 있는 SIMD 명령을 사용하는 데 사용됩니다.

컴파일러가 루프를 자동 벡터화할 수 있도록 하는 일반적인 지침은 루프의 다른 반복에 흐름 및 반의존성 b/w 데이터 요소가 없는지 확인하는 것입니다.

http://en.wikipedia.org/wiki/Data_dependency

Intel C++/Fortran 컴파일러와 같은 일부 컴파일러는 코드를 자동 검색할 수 있습니다.루프를 벡터화할 수 없는 경우 Intel 컴파일러는 이러한 작업을 수행할 수 없는 이유를 보고할 수 있습니다.보고서를 사용하여 코드를 벡터화할 수 있도록 수정할 수 있습니다(가능하다고 가정).

의존성은 '현대 건축을 위한 컴파일러 최적화: 의존성 기반 접근법'이라는 책에서 자세히 다룹니다.

벡터화는 큰 데이터를 저장할 수 있는 단일 레지스터로 제한될 필요가 없습니다.'4 x 32' 비트 데이터를 저장하기 위해 '128' 비트 레지스터를 사용하는 것과 같습니다.그것은 구조적인 한계에 따라 다릅니다.일부 아키텍처는 자체 레지스터가 있는 서로 다른 실행 단위를 가집니다.이 경우 데이터의 일부를 해당 실행 장치에 공급하고 결과를 해당 실행 장치에 해당하는 레지스터에서 가져올 수 있습니다.

예를 들어, 다음과 같은 경우를 생각해 보십시오.

for(i=0; i < N; i++)
{
a[i] = a[i] + b[i];
}



실행 단위가 두 개인 아키텍처에서 작업하는 경우 벡터 크기는 두 개로 정의됩니다.위에서 언급한 루프는 다음과 같이 재구성됩니다.

i+=i=0, i<(N/2), i+=2)에
{
= + a[i] = a[i] + b[i];


= + a[i+1] = a[i+1] + b[i+1];
}

참고: for 문 안의 2는 벡터 크기에서 파생되었습니다.

내가 두 개의 실행 유닛을 가지고 있기 때문에 루프 안에 있는 두 개의 문이 두 개의 실행 유닛에 공급될 것입니다.합계는 실행 단위에 별도로 누적됩니다.마지막으로 (두 실행 단위에서) 누적된 값의 합이 수행됩니다.

은 좋은관은입니다.
루프를 벡터화하기 전에 (루프의 다른 반복 사이의) 의존성과 같은 제약 조건을 확인해야 합니다.
함수 호출을 방지해야 합니다.
포인터 액세스는 별칭을 만들 수 있으므로 이를 방지해야 합니다.

SSE 코드 생성입니다.

matrix1[i][j] + matrix2[i][j]에 float 매트릭스 코드가 있는 루프가 있고 컴파일러가 SSE 코드를 생성합니다.

libSIMDx86(소스 코드)도 살펴 볼 수 있습니다.

잘 설명된 좋은 예는 다음과 같습니다.

분기를 피하기 위한 선택: 작은 Altivec 예제

언급URL : https://stackoverflow.com/questions/1516622/what-does-vectorization-mean

반응형