Company
교육 철학

왜 GPU 프로그래밍은 이렇게 난장판인가?(앞으로 게임 개발자에게 DirectX가 그렇게 중요하지 않은 이유)

GPU 프로그래밍이 혼란스러운 이유

GPU 프로그래밍은 약간 번거롭습니다. 이를 수행하기 위한 여러 프레임워크가 있지만, 특정 플랫폼에서만 작동하거나, 이상한 셰이딩 언어를 사용하거나, 일부 기능을 지원하지 않습니다. 어떤 경우에는
하나의 프로젝트에서 여러 프레임워크를 조합해야 합니다. 저는 이 모든 불편함에 대해 불평하기 위해 영상 하나를 통째로
만들었습니다.
반면 CPU 프로그래밍은 훨씬 더 편리합니다: 현대 프로그래밍 언어로 작성된 애플리케이션은 시장에 있는 거의 모든 CPU에서 실행될 수 있습니다. 예전에는 훨씬 더 나빴습니다: 개발자들은
다양한 CPU 아키텍처에 맞게 프로그램을 수동으로 변환하고[1], 애플리케이션을 빌드하기 위해 컴파일러 툴체인을
구매해야 했습니다[2]. 하지만 시간이 지나면서 많이 개선되었습니다.
그렇다면 두 가지 사이에 왜 이렇게 큰 차이가 있을까요? 왜 GPU 프로그래밍은 이렇게 혼란스러울까요?

CPU 시장

이 질문에 답하기 위해, 먼저 CPU 프로그래밍이 어떻게 발전했는지 살펴봐야 합니다. 이것이
GPU 섹션에 중요하다고 약속합니다.
중앙 처리 장치 또는 CPU는 컴퓨터의 전기 부품으로, 수학적 계산이나 입출력 작업과 같은
명령을 실행합니다[3]. 이는 이런 모양의 명령어 시퀀스인 기계어를 읽어서 작동합니다[4][5]. 기계어를 직접 손으로
작성하는 것은 매우 지루하고 오류가 발생하기 쉽기 때문에, 1940년대부터[6] 사람들은 어셈블리
언어를 사용해 왔습니다. 이는 기계어 명령을 간단한 니모닉에 매핑하여 프로그래밍을 용이하게 합니다.
하지만 여전히 사용하기 상당히 어렵고, 어셈블러가 특정 CPU 아키텍처에 묶여 있기 때문에
코드를 다른 플랫폼에 맞게 조정해야 합니다[3].
또 다른 개선점은 포트란과 C와 같은 프로그래밍 언어의 형태로 나타났습니다. 이들은 어셈블리보다
더 고수준입니다: CPU가 실행할 명령어를 직접 작성하는 대신, 키워드와 수학적 기호로 이루어진
추상 구문을 사용하여 더 직관적인 방식으로 계산을 표현합니다. 이 소스 코드는 컴파일러에 의해
자동으로 기계어로 변환되며, 컴파일러는 여러 CPU 아키텍처를 대상으로 할 수 있습니다[4].
프로그래밍 언어는 매우 편리하기 때문에, 이 시점에서 CPU 프로그래밍이 부드럽고 쉬운 개발의
황금기에 접어들었다고 상상할 수 있습니다. 그러나 그렇지 않았습니다. 70년대에는 컴퓨터
생태계가 상당히 분화되어 있었고 기업들이 자사 제품을 철저히 통제하는 것이 일반적이었습니다.
예를 들어 IBM은 메인프레임 컴퓨터의 대부분 구성 요소를 제조하고 대부분의 소프트웨어를 작성했습니다.
그런 종류의 수직 통합으로 만들어진 컴퓨터는 비쌌지만, IBM은 플랫폼을 완전히 통제할 수 있었기 때문에
이를 선호했습니다[7]. 소비자들은 벤더 록인 상태에 갇혀 IBM의 지원에 의존해야 했습니다.
애플도 - 지금도 그렇습니다 - 비슷한 전략을 가지고 있습니다: 자사 기기의 하드웨어와 소프트웨어를 만들고,
이는 많은 힘을 부여합니다. 예전에는 문서와 개발 도구까지 판매했습니다[8]! 그러나 제품을 너무 많이
통제하는 것에는 단점이 있습니다: 시장에 적응하는 속도가 느려지고, 공급망 중단에 더 취약해지며,
서드파티 개발이 더 어려워집니다[9].
IBM은 이를 깨달았습니다. 가정용 컴퓨터 시장에 진입하고 싶었지만 새 제품을 처음부터 개발하는 데
너무 많은 시간이 걸릴 것이었기 때문에, 대신 다른 회사에서 만든 구성 요소를 조립하기로 결정했습니다[10].
그리고 이는 성공했습니다: IBM 개인용 컴퓨터는 상업적으로 성공했습니다[11]. 하지만 이는 또한
역효과를 가져왔습니다. PC는 다른 회사들이 구성 요소를 만들 수 있도록 잘 문서화되어 있었고, 경쟁사들은
이 오픈 디자인을 활용하여 PC를 복제하고 호환 가능한 클론을 판매했습니다. IBM은 기뻐하지 않았지만, 이는
소비자에게 가격을 낮추고 상호 호환성을 향상시켰습니다.
개방성과 비밀 유지 사이에는 항상 트레이드오프가 있습니다. 제품을 공개적으로 문서화하면
빠르게 개발하고 시장을 장악하기 쉽지만, 경쟁사도 무임승차할 수 있습니다. 만약
제품을 가능한 한 비밀로 유지한다면, 더 높은 마진을 가질 수 있지만 시장을 혁신하기가 더 어렵습니다.
CPU에서도 같은 현상을 볼 수 있습니다. 제조사가 칩을 잘 문서화하면 프로그래머가 코드를 작성하고 최적화하기
쉬워지고[12], 이는 판매 포인트가 됩니다. 하지만 제조사들은 CPU의 내부 작동 방식을 공개하지 않고, 정보를
숨기고 법적 보호를 사용하여 영업 비밀을 보존합니다.
이처럼 제조사들은 컴퓨터가 어떻게 만들어지고 어떤 소프트웨어를 실행할 수 있는지 통제했지만,
회사들 간의 경쟁이 더 많은 개방성을 촉진했고, 이는 개발자들이 제조사에 의존하지 않고 직접 컴파일러를 작성하기 쉽게 만들었습니다. 유료 컴파일러는 여전히
존재하지만[13][14], 덜 일반적이 되었고, 이제 무료이며 상호 호환 가능한 컴파일러가 있습니다[15]
[16]. 인텔과 IBM이 관대함으로 문서를 공개한 것이 아니라, 경쟁사보다 더 많은 제품을 판매하기 위한 비즈니스 전략이었습니다. 이러한 회사들은 실제로 시장을 지배하기 시작하면 상당히 반경쟁적이 될 수 있습니다[8]. 소비자의 이익을 증진시키는 또 다른 방법은
공개 아키텍처를 통해서입니다. 예를 들어, RISC-V는 원래 캘리포니아 대학교 버클리에서 개발한 오픈 CPU
표준입니다. 누구나 소송당하거나 라이선스 비용을 지불하지 않고 RISC-V CPU를 만들 수 있으며,
이는 이 산업에서 혁신을 장려합니다[19].
CPU 프로그래밍은 완벽하지 않지만, 경쟁과 오픈 프로젝트가 없었다면 수직 통합의 암흑기에
머물렀을 수도 있습니다. 음, 기술 산업의 또 다른 부분이 여전히 동일한 끔찍한 비즈니스 관행에
갇혀 있는지 궁금하네요.

GPU 시장

그래픽 처리 장치 또는 GPU는 명령을 병렬로 실행하는 전기 부품입니다[20]. 이름이 그래픽용으로만
보이지만, 병렬로 분할할 수 있는 실질적으로 모든 계산이 GPU의 혜택을 받을 수 있습니다. 여기에는 일부 물리
시뮬레이션[21]과 DNA 분석[22], 그리고 인공지능이라는 모호한 응용 프로그램도 포함됩니다[23].
엔비디아는 1999년에 현대적 의미에서 GPU를 처음으로 공식적으로 정의한 회사였지만[24],
그 이전에도 이미지를 조작하도록 설계된 많은 칩이 만들어졌습니다[25].
처음에 이러한 칩은 정점을 가져와 처리하고 이미지를 출력하는 그래픽 파이프라인만 실행하도록
설계되었습니다. 이를 고정 기능 프로그래밍이라고 합니다: 파이프라인의 매개변수를 수정할 수 있지만,
임의의 코드를 실행할 수는 없습니다[26]. 각 제조사마다 방식이 달랐기 때문에,
각 GPU에 맞게 코드를 조정해야 했습니다[27]. 이 문제를 해결하기 위해 일부 회사들은 OpenGL과 Direct3D와 같은
크로스 플랫폼 표준을 만들었고, 개발자들은 생산성을 향상시켰기 때문에 이를 채택했습니다.
이들은 애플리케이션 프로그래밍 인터페이스이지 컴파일러가 아닙니다. GPU가 직접 실행할 수 있는 기계어를
생성하는 것이 아니라, GPU 드라이버가 기계어로 변환하는 표준 명령을 생성합니다[28]. 그리고 컴퓨터 시장 초기와
비슷하게, 대부분의 GPU 제조사들은 아키텍처에 관한 세부 정보를 거의 공개하지 않음으로써 아키텍처를 보호했습니다.
사람들은 자신만의 컴파일러를 작성할 수 없었기 때문에, GPU를 사용하는 유일한 방법은 표준
API나 제조사별 도구를 통해서였습니다[29].
2000년대 초반, GPU API는 그래픽 파이프라인의 일부 단계에서 코드를 실행하여 더 다양한 시각적 효과를 얻을 수 있는
셰이더 지원을 시작했습니다. 그리고 사람들은 이를 다른 애플리케이션을 가속화하는 데도 사용할 수 있다는 것을 깨달았습니다.
하지만 그래픽 파이프라인을 통해야 한다는 점을 기억하세요. 그래서 사람들은 텍스처에 숫자를 넣고, 텍스처를 처리하는 셰이더를 작성하고,
파이프라인을 실행한 다음, 출력 이미지를 분석하여 결과를 얻었습니다[30]. 이는 끔찍한 해킹이지만, 그들은
그것에 갇혀 있었습니다. 일부 프로젝트는 이 혼란을 단순화하려고 했지만, 제조사들의 지원을 받지 못했고
실제로 성공하지 못했습니다[I]. 결국, 엔비디아는 개발자들이 범용 프로그램으로 고군분투하는 것을 보고
그래픽 파이프라인을 생략하는 CUDA라는 프레임워크를 출시하기로 결정했습니다[32]. 이는 훨씬 더 편리하여
신경망을 훈련시키는 데 인기를 얻었고, 해당 분야의 많은 획기적인 발견들이 CUDA로 작성된 프로그램을 사용하여
이루어졌습니다[33]. 그리고 이는 여전히 널리 사용됩니다. 엔비디아는 시장에서 정말 지배적이며, 약
90%의 독립형 GPU를 통제하고 있고[34], AMD가 나머지를 차지하며 인텔은 거의 아무것도 판매하지 않습니다[35].
독립형 GPU는 고급 그래픽 애플리케이션과 AI 모델 훈련에 사용되는 것입니다. 또 다른
유형의 GPU는 통합 GPU입니다. 이들은 계산량이 적은 애플리케이션에 더 자주 사용되며,
엔비디아는 그 시장에 없습니다[36].
CPU에서 봤듯이, 기기 제조사는 시장 우위를 유지하기 위해 제품의 호환성을 낮추는 데 관심이 있습니다.
엔비디아는 개발자들이 프로그램을 최적화하는 데 도움이 될 만큼만 GPU 문서를 제한적으로 공개하지만,
다른 제조사들이 CUDA 호환 GPU를 만들어 시장에 무임승차하기에는 충분하지 않습니다[29]. IBM은 가정용 컴퓨터를
빠르게 점령하기 위해 절박했기 때문에 PC를 문서화했고, 이는 상호 호환성을 개선했습니다. 엔비디아는 이미 정상에
있기 때문에, 더 투명해짐으로써 시장을 혼란시킬 필요가 없습니다. 독립형 GPU 시장의 일부 점유율을 확보하려는 노력으로,
AMD와 인텔은 GPU를 더 철저히 문서화하고 프레임워크를 오픈소스로 제공합니다[37][38]. 이는 그들이 자유 투사이기 때문이
아니라, 소비자들이 자사 제품을 구매하도록 설득하기 위해서입니다. 그러나 그들의 개방성은 지금까지 실제로 성과를 거두지
못했습니다. 엔비디아가 너무 앞서 있기 때문입니다.
기업들은 자체 하드웨어를 판매하기 위해 자체 API를 홍보하고 싶어하지만, 어느 정도의 크로스 플랫폼 지원을
가능하게 해야 합니다. 그렇지 않으면 아무도 그들의 칩을 구매하지 않을 것입니다. 그리고 이 두 가지
이해관계는 종종 충돌합니다. 예를 들어, 애플은 CUDA에 대한 직접적인 응답으로 OpenCL을 개발했습니다. 이는
GPU에서 범용 컴퓨팅을 가능하게 하지만, 모든 곳에서 실행되도록 설계되었습니다[39]. 여러 제조사가
첫 번째 버전을 지원했지만, 자체 API에 투자하기 위해 새로운 기능을 지원하지 않기로 결정했습니다.
OpenCL은 좋은 API지만, 수년에 걸쳐 정체되었습니다[40]. Vulkan도 비슷한 문제가 있습니다.
크로스 플랫폼 그래픽 API로서 OpenGL을 계승하기 위해 만들어졌기 때문에, GPU 제조사들이 지원하기로 동의한 필수 기능 세트가 있습니다. 하지만 일부 벤더들은 자체 장치에 구현한 추가 기능을 원했기 때문에,
모든 곳에서 작동하지 않는 선택적 Vulkan 확장 기능도 있습니다[41]. 특정 회사는 Vulkan을 전혀 지원하지 않기로
결정했고, 그 장치에서는 이상한 호환성 레이어를 사용해야 합니다[42]. 그래서 우리는 크로스 플랫폼 지원을 개선하기 위한
또 다른 API를 얻었고[43], 이것도 일부 기능이 누락되어 있습니다[44]. 다른 프로젝트들이 이를 해결할 것이라고
확신합니다[45]. 끝이 없습니다! 모든 제조사들이 공통 API를 만들기 위해 모이더라도, GPU 프로그래밍은 항상
경쟁적인 이해관계로 인해 파편화된 상태로 남아 있습니다.
제가 알아본 바로는, 경쟁 부족이 GPU 프로그래밍을 괴롭히는 주요 문제이지만
유일한 문제는 아닙니다. 기술적인 측면에서 GPU는 대규모 병렬이며 많은 변형이 있습니다[46]. 이러한 복잡성은
CPU보다 문서화하기 더 어렵게 만들어, 기술을 더 불투명하게 만드는 데 기여합니다. 그리고 법적 관점에서, 80년대 초반 이후로
많은 것이 변했습니다. 정부는 칩 설계에 저작권을 부여하기 쉽게 만들었고[47],
기업들은 지적 재산권을 더 적극적으로 보호합니다: 예를 들어, 엔비디아는 다른 장치에서 CUDA를 실행하는 것을
억제하기 위해 법적 예방 조치를 취합니다. 다시 말하지만, 소비자들이 같은 생태계에 갇히도록 하기 위해서입니다[48].
전반적으로, GPU 프로그래밍이 혼란스러운 주요 이유는 엔비디아의 지배력이 경쟁을 방해하고,
이는 상호 호환성을 정체시키기 때문입니다. 엔비디아는 그림자 속 계략을 사용한 것이 아니라, 좋은 GPU를 만들고,
초기에 좋은 API에 투자하고, 법적 마법을 사용하여 IP를 보호했습니다. 오늘날, 많은 소비자들이 일종의
그들의 생태계에 갇혀 있습니다. 저는 젠슨 황이 아무 이유 없이 GPU 프로그래밍을 더 번거롭게 만들려는
파이널 판타지 빌런이라고 생각하지 않습니다. 저는 그의 회사가 모든 회사가 그렇듯이 다른 모든 사람들의 희생을 무릅쓰고
이익을 극대화하는 방법을 찾는다고 생각합니다. 하지만 그들이 너무 나아가면, 결과가
생길 수 있습니다.

반독점

1974년, 미국 정부는 AT&T가 전화 인프라를 독점한 것에 대해 반독점 소송을 제기했습니다[49].
그런데 연방 거래 위원회에 따르면 독점은 약탈적 관행으로 시장을 해치는 데 사용하지 않는 한 합법입니다[50].
하지만 40년대부터, AT&T는 시장 지배력을 남용한 혐의로 고소당했습니다. 많은 쟁점이 있었지만,
특히 악랄한 것 중 하나는 전화 장비를 제조하는 자회사인 웨스턴 일렉트릭이었습니다.
AT&T는 많은 전화기가 어떻게 만들어지고 작동하는지 통제했습니다. 가격을 지시할 수 있었고,
이 상황은 점점 더 문제가 되었습니다.
미국과 대부분의 다른 국가들은 경쟁법, 즉 반독점법을 가지고 있습니다[51].
이들은 독점, 담합을 규제하고, 합병과 인수를 감독하며, 기본적으로 약탈적 관행으로 이어질 수 있는
모든 시장 행동을 다룹니다. AT&T는 분명히 반독점법을 위반하고 있었지만, 국가가 독점을 분할하기 전에,
그것이 시장을 해치고 있다는 것을 증명해야 하며, 그에 대한 충분한 증거를 모으는 데는 시간이 걸립니다. 합의에 도달하는 데
약 8년이 걸렸고, AT&T는 여러 회사로 분할되었습니다[52]. 더 최근의 반독점 사례들도 있습니다. 애플은
그 분야에서 경험이 있고[53], 아마존[54], 구글[55], 마이크로소프트[56], 인텔[57]도 마찬가지입니다.
하지만 그들은 AT&T처럼 갈기갈기 찢기지는 않았습니다. 아직은요.
미국 법무부는 2024년에 엔비디아의 지배적인 시장 위치 때문에 조사를 시작했습니다[58]. 그리고 네, 정말로
독점처럼 보입니다[59]. 만약 CUDA가 더 투명해지도록 강제되거나 아키텍처가 더 개방되면
제가 가장 먼저 환호할 것입니다. 그러면 GPU가 프로그래밍하기 훨씬 더 편리해질 것입니다. 하지만 그것은 매우 가능성이 낮고
최소한 몇 년은 걸릴 것이기 때문에, 그것을 기대하지 맙시다.
독점에 찬성하는 몇 가지 주장이 있습니다. 예를 들어, 대기업이 작은 기업보다 더 생산적이고
독점을 너무 공격적으로 분할하면 진보를 방해할 수 있다고 주장할 수 있습니다[60]. 또는 국가가 무능한 사람들에 의해
운영되고 시장이 스스로 규제하도록 해야 한다고 주장할 수도 있습니다[61]. 가장 나쁜 주장은 회사가 독점을 확립하고 돈을 갈취하면,
비즈니스 기회가 생긴다는 것입니다: 다른 회사가 더 저렴한 제품을 제안할 수 있고, 이는 독점을
깨뜨립니다[62]. 하지만 그것은 거의 일어나지 않습니다. 대기업은 경쟁을 방지하는 진입 장벽을 쉽게 만들 수 있을 만큼
많은 자원을 가지고 있습니다. 당시에는 아무도 AT&T와 경쟁할 수 없었고, 지금 엔비디아를 어떻게 밀어낼 수 있을지
모르겠습니다.
현실은 보이지 않는 손이 작은 상점 주인들의 세계에서만 작동한다는 것입니다. 대기업은
작은 경쟁자들에게 너무 강력하고 그들은 자신들의 이익만을 위해 일합니다. 말하자면, 그들은 정렬되어 있지 않습니다.
국가는 건강한 경제 환경을 유지하고 소비자의 권리가 존중되도록 할 책임이 있지만, 동시에
사법 절차를 따라야 하므로, 우리는 수년 동안 독점이나 준독점에 갇혀 있을 수 있습니다.

더 나아질 수 있을까

큰 정부가 우리를 위해 모든 것을 하기를 기다리기보다, 우리는 GPU 프로그래밍이
반독점 기적 없이도 더 나아질 수 있는지 스스로에게 물어볼 수 있으며, 몇 가지 가능성이 있습니다.
첫 번째는 경쟁이 더 치열해지기를 바라는 것입니다. AMD와 인텔은, 음, 최선을 다하고 있다고
확신하지만, 그들은 심각한 경쟁자가 아닙니다. 중국에서는 모어스레드(Moore Thread)라는
비교적 새로운 GPU 제조사가 경쟁을 활성화할 수 있습니다[63]. 아마도 이러한 회사들이
더 나아지고 더 많은 투명성을 촉진할 것입니다. 개방형 아키텍처를 만들기 위한 프로젝트도 있습니다. GPU를 위한
RISC-V와 비슷한 것으로, 이들은 혁신과 상호 호환성을 장려할 수 있습니다[64][65].
또 다른 가능성은 소비자들이 엔비디아에 압력을 가하는 것입니다. 예를 들어, 개발자들이 CUDA 대신 오픈
프레임워크를 사용하기 시작하면, 엔비디아는 이러한 프로젝트에 대한 지원을 개선하기로 결정할 수 있습니다.
하지만 우리는 엔비디아가 오픈소스 프로젝트에 긍정적으로 반응하도록 강제할 방법이 없습니다. 저는 보이콧과 같은
더 직접적인 형태의 압력을 분명히 지지하지 않을 것입니다. 왜냐하면 엔비디아는 너무 크기 때문에 소비자들이 그것의 시장 존재감을 크게 바꿀 수 있는 방법이 없기 때문입니다. 분명히 말하자면, 보이콧은 우리가
본문에서 언급된 참고 자료들의 링크는 본문에 직접 표시되어 있지 않고, [숫자] 형식의 인용 표기만 있습니다. 글에서 인용된 몇 가지 주요 참조들은 다음과 같습니다:
정확한 참조 링크 URL은 원문에 포함되어 있지 않지만, 이 번호들이 해당 주제에 관한 외부 자료를 가리키는 것으로 보입니다.