[Swift] SIMD는 무엇이고 어떻게 사용하는가 ?

2023. 3. 3. 13:28🍏/Swift

SIMD (Single Instruction Multiple Data)
하나의 명령어로 여러 개의 데이터를 처리하는 기술

SIMD


SIMD ?

 SIMD는 하나의 명령어로 동시에 여러 개의 데이터를 처리하기 때문에 벡터 연산에 매우 효과적이며, 데이터 병렬성을 활용하여 연산 처리 하므로 성능이 뛰어나다.

 SIMD는 보통 과학 및 공학 분야에서 사용되며, 특히 컴퓨터 그래픽스, 신호 처리, 이미지 처리, 머신 러닝 및 딥 러닝 등의 분야에서 많이 활용. 하지만 SIMD는 하드웨어에서 지원해야 하므로, CPU나 GPU에서 지원하는 SIMD 기술을 확인해야 한다. 또한 SIMD를 사용할 때에는 데이터 정렬과 같은 세부적인 구현 방법도 고려해야 하므로, 주의가 필요하다.


Swift 에서의 SIMD2

swift SIMD2

 SIMD2는 SIMD 기술 중 하나로, 두 개의 64비트 실수나 정수 데이터를 처리하는 명령어. SIMD2를 사용하면 두 개의 데이터를 동시에 처리하기 때문에 일반적인 연산보다 빠르게 처리 가능. 예를 들어, SIMD2를 사용하여 벡터의 내적, 행렬의 곱셈 등을 계산할 수 있다.

Swift에서 SIMD2는 SIMD 기술을 활용한 데이터 타입으로 제공. SIMD2는 두 개의 64비트 실수나 정수 데이터를 처리하는 2차원 벡터 연산을 수행할 수 있는 데이터 타입.

 Swift에서 SIMD2 타입은 simd 라이브러리를 사용하여 사용 가능. 예를 들어, 다음과 같은 코드를 사용하여 두 개 이상 의 SIMD2 실수 데이터를 더할 수 있다.

import simd

let a = SIMD2<Float>(1.3, 2.1)
let b = SIMD2<Float>(2.8, 4.3)
let c = SIMD2<Float>(1.4, 1.3)

var result = a + b + c// SIMD2<Float>(5.5, 7.7)

print(result.x, result.y, result.description)

print(
//MARK: - basic
result,

//MARK: - up(ceil): Round to the closest allowed value that is greater than or equal to the source.
result.rounded(.up), // 소스보다 크거나 같은 허용되는 가장 가까운 값으로 반올림.

//MARK: - down(floor): Round to the closest allowed value that is less than or equal to the source.
result.rounded(.down), //소스보다 작거나 같은 허용된 가장 가까운 값으로 반올림.

//MARK: - .awayFromZero: Round to the closest allowed value whose magnitude is greater than or equal to that of the source.
result.rounded(.awayFromZero), //소스의 크기보다 크거나 같은 허용된 가장 가까운 값으로 반올림.

//MARK: - .toNearestOrAwayFromZero: Round to the closest allowed value; if two values are equally close, the one with greater magnitude is chosen.
result.rounded(.toNearestOrAwayFromZero), //허용되는 가장 가까운 값으로 반올림하고, 두 값이 똑같이 가까운 경우 크기가 더 큰 값이 선택됩니다.

//MARK: - .toNearestOrEven: Round to the closest allowed value; if two values are equally close, the even one is chosen.
result.rounded(.toNearestOrEven), //허용되는 가장 가까운 값으로 반올림하고, 두 값이 똑같이 가까우면 짝수 값이 선택됩니다.

//MARK: - .towardZero: Round to the closest allowed value whose magnitude is less than or equal to that of the source.
result.rounded(.towardZero), // 크기가 원본의 크기보다 작거나 같은 허용된 가장 가까운 값으로 반올림합니다.

separator: "\n"
)

print(ceil(result), round(result), floor(result))

simd2 result

위 코드에서는 SIMD2<Float> 타입의 변수 a, b, c를 생성하고, a, b, c를 더한 결과를 result 변수에 저장. 이렇게 SIMD2를 사용하면 두 개 이상의 실수 데이터를 동시에 처리할 수 있기 때문에 일반적인 덧셈보다 빠르게 처리된다.

또한 타입 내부에서 다양한 Round 함수를 제공하므로 유용하게 사용 가능. 

SIMD2는 다양한 데이터 타입을 지원하며, 벡터 연산을 수행할 때의 속도 향상을 위해 최적화되어 있다. simd 라이브러리는 SIMD2 이외에도 다양한 데이터 타입을 지원. 예를 들어, SIMD3, SIMD4, SIMD8 등의 다양한 차원의 벡터 연산이 가능하며 또한 simd 라이브러리는 다양한 수학 함수와 연산 함수도 제공하므로, 벡터 연산을 수행할 때의 속도 향상을 위해 이를 활용할 수 있다.


SIMD2 지원 operator

 

SIMD2 | Apple Developer Documentation

A vector of two scalar values.

developer.apple.com