고 언어에서의 플랫폼 독립적 SIMD
1. 이게 뭔가요?
프로그래밍 언어 고 개발팀이 서로 다른 컴퓨터 하드웨어 환경에서도 일관되게 고속 병렬 연산을 수행할 수 있도록 지원하는 실험적이고 이식성이 높은 새로운 도구 모음인 심드 패키지의 설계 개념과 활용 방식을 설명하는 공식 블로그 글입니다. 단일 명령 다중 데이터란 컴퓨터의 중앙처리장치가 여러 개의 데이터 묶음을 한 번에 처리하여 암호화나 인공지능 연산처럼 계산이 많은 작업을 빠르게 수행하도록 돕는 핵심 기술을 뜻합니다.
2. 왜 화제인가요?
기존에는 고 언어로 컴퓨터의 관련 기능을 쓰려면 플랫폼마다 완전히 다른 저수준의 어셈블리 언어를 직접 작성해야 했으며, 컴퓨터 구조마다 지원하는 연산 방식과 벡터의 크기가 제각각이어서 코드를 유지 관리하기가 매우 까다로웠습니다. 이로 인해 성능이 극도로 중요한 핵심 프로그램에서만 제한적으로 쓰였고, 대다수 프로그램은 컴퓨터 자원을 충분히 활용하지 못했습니다. 이번에 도입된 새로운 패키지는 개발자가 컴퓨터 종류나 데이터 크기에 구애받지 않고 코드를 딱 한 번만 작성해도 여러 플랫폼에서 공통으로 쓸 수 있게 해주며, 특정 기능을 지원하지 않는 컴퓨터 환경에서도 소프트웨어가 대신 처리하는 가상 처리 방식을 제공하여 호환성 문제를 해결하려는 목적을 가집니다.
3. 핵심 내용
고 언어 1.26 버전과 1.27 버전에는 관련 연산을 위한 실험적인 제어 도구 모음이 포함되어 있습니다. 기존 패키지는 고정된 벡터 크기를 없애고 모든 플랫폼이 공통으로 지원하는 연산만 남긴 뒤, 빈틈은 다른 고속 연산 명령어로 효율적으로 흉내 내어 채우는 방식을 씁니다. 현재 이 패키지는 엑스86 계열 64비트 개인용 컴퓨터나 서버 환경에 쓰이는 기술과, 스마트폰이나 애플 맥 컴퓨터 등에 쓰이는 에이전 고 계열의 네온 기술, 그리고 웹 브라우저 환경의 관련 명령어를 지원합니다. 벡터 자료형은 첫 글자가 대문자이고 복수형인 기본 자료형으로 이루어져 있으며, 연속된 공간에 데이터를 담는 슬라이스에서 불러오거나 저장합니다. 예를 들어 내부곱을 계산하는 함수에서는 실수형 숫자 목록을 불러와 관련 장치로 동시에 곱하고 더한 뒤 남은 부분까지 처리하여 최종 합계를 구합니다. 또한 관련 비교 연산은 각 벡터 요소의 너비와 일치하는 마스크 값을 만들어내어 특정 조건에 맞는 데이터를 골라내거나 걸러내는 데 쓰입니다. 패키지는 데이터 불러오기와 채우기, 저장과 문자열 변환, 절대값 계산, 덧셈, 뺄셈, 곱셈, 나눗셈, 제곱근, 조건 선택, 최대와 최소값 비교를 비롯해 논리합과 논리곱 같은 불리언 연산, 비교 연산, 형식 변환, 비트 이동 및 회전 연산, 형태 재구성 연산을 지원합니다. 공통 패키지 기능만으로 부족할 때는 플랫폼별 하드웨어 맞춤형 코드로 변환할 수 있는 장치도 마련되어 있어, 비트 중 값이 1인 것의 개수를 세는 기능처럼 현재 공통 꾸러미에 없는 연산도 하드웨어별 특성에 맞추어 직접 구현할 수 있습니다. 하드웨어 가속 기능이 아예 없는 환경에서는 소프트웨어적인 비트 연산을 거쳐 정확한 결과를 내는 공통 대체 함수가 동작합니다. 개발자는 고 디버그 설정을 변경하여 다양한 하드웨어 구성에서 관련 코드를 테스트할 수 있습니다. 예를 들어 특정 설정값에 따라 하드웨어 지원이 가능하더라도 가상 처리를 사용하거나, 일백이십팔비트, 이백오십육비트, 오백십이비트 벡터와 그 기능들을 강제로 사용할 수 있으며, 일부 명령어가 없더라도 코드를 계속 실행해 볼 수 있습니다. 내부적으로 이 패키지는 컴파일러 앞단에서 소스 코드를 미리 읽어 형태를 바꾸는 작업을 거치며, 불필요한 조건 분기 과정을 없애 성능 저하를 방지합니다. 향후 고 1.28 버전에서는 저전력 고성능 칩에서 쓰이는 가변 크기 벡터 연산 기술 지원이 추가될 예정이며, 일치하는 개수 세기, 마스크 연산, 축소 연산, 벡터 자리 바꾸기 같은 다양한 연산과 일부 기능 변형이 함께 포함될 계획입니다.
4. 나에게 어떤 영향이 있나요?
일반 사용자라면 이 기술이 적용된 고 언어 기반의 프로그램이나 서비스가 대용량 데이터를 더 빠르게 처리하고 효율적으로 작동하는 혜택을 간접적으로 누리게 됩니다. 개발자의 경우, 여러 종류의 하드웨어에 맞추어 복잡한 어셈블리 코드를 따로 만들지 않고도 성능을 높일 수 있는 강력한 선택지가 생깁니다. 다만 현재는 실험 단계이며, 특정 연산은 아직 지원하지 않거나 별도의 환경 변수 설정을 거쳐야 하므로 실제 서비스에 도입할 때는 지원 범위와 성능을 신중하게 확인해야 합니다.