CUDAC 및 C++ 설명
CUDAC와 C++의 성격에 대해 잘 설명해 줄 수 있는 사람?제가 알기로는, CUDA는 엔비디아의 GPU 라이브러리와 함께 C가 되어야 하는 것으로 알고 있습니다.현재 CUDAC는 일부 C++ 기능을 지원하지만 다른 기능은 지원하지 않습니다.
엔비디아의 계획은?C를 기반으로 구축하고 자체 라이브러리를 추가할 예정입니까(예:추력 대 STL) C++와 비슷한 것?그들은 결국 모든 C++를 지원할 것입니까?에서 C++요?.cu일?
CUDAC는 C 구문을 가진 프로그래밍 언어입니다.개념적으로 C와 상당히 다릅니다.
이것이 해결하려는 문제는 여러 프로세서에 대해 여러 개의 (유사한) 명령 스트림을 코딩하는 것입니다.
CUDA는 SIMD(Single Instruction Multiple Data) 벡터 처리보다 더 많은 것을 제공하지만, 데이터 스트림 >> 명령 스트림을 제공하거나, 그렇지 않으면 훨씬 적은 이점을 얻을 수 있습니다.
CUDA는 이를 위해 몇 가지 메커니즘을 제공하고 복잡성의 일부를 숨깁니다.
CUDA는 멀티 코어 x86과 같은 다양한 명령어 스트림에 최적화되어 있지 않습니다.CUDA는 x86 벡터 명령어와 같은 단일 명령어 스트림이나 x86 벡터 명령어와 같은 특정 데이터 유형에 제한되지 않습니다.
CUDA는 병렬로 실행할 수 있는 '루프'를 지원합니다.이것이 가장 중요한 기능입니다.CUDA 시스템은 '루프'의 실행을 분할하고 동일한 프로세서 배열에 걸쳐 '루프' 본체를 동시에 실행하는 동시에 정상적인 순차 루프(특히 CUDA가 루프 "인덱스"를 관리함)의 일부 환상을 제공합니다.개발자가 '루프'를 효과적으로 작성하기 위해서는 GPU 기계 구조에 대한 인식이 필요하지만, 거의 모든 관리는 CUDA 런타임으로 처리됩니다.효과는 하나의 '루프'와 동시에 수백 개(또는 수천 개)의 '루프'가 완성됩니다.
는 CUDA 는처럼 합니다.if나뭇가지. 수 , 에 대해 의 하위 됩니다. if 테스트와 일치하는 코드를 실행하는 프로세서만 활성화될 수 있으므로, if 테스트의 각 '브랜치' 에 대해 프로세서의 하위 집합이 활성화됩니다.를 들어 이sif... else if ... else ...있고, 3개의 가 있습니다.각 프로세서는 하나의 분기만 실행하고 if가 완료되면 나머지 프로세서와 '재동기'할 준비가 됩니다.분기 조건 중 일부가 프로세서에 의해 일치하지 않을 수 있습니다.따라서 분기를 실행할 필요가 없습니다(예를 들어, 분기가 세 개인 경우).그러면 두 합니다가 if좀더 빨리요
'마법'이란 없습니다.프로그래머는 CUDA 장치에서 코드가 실행된다는 것을 인지하고 이에 대한 코드를 의식적으로 작성해야 합니다.
CUDA는 오래된 C/C++ 코드를 사용하지 않고 프로세서 배열에 걸쳐 연산을 자동으로 실행합니다.CUDA는 일반적인 C와 대부분의 C++를 순차적으로 컴파일하고 실행할 수 있지만, 최신 CPU보다 더 천천히 순차적으로 실행되기 때문에 얻을 수 있는 것은 거의 없습니다.이는 일부 라이브러리의 코드가 CUDA 기능과 아직 잘 일치하지 않음을 의미합니다.CUDA 프로그램은 multi-kByte 비트 벡터에서 동시에 작동할 수 있습니다.CUDA는 기존의 순차적 C/C++ 라이브러리 코드를 자동으로 변환할 수 없습니다.
CUDA는 친숙한 C/C++ 구문을 사용하여 코드를 작성하는 비교적 간단한 방법을 제공하고, 몇 가지 추가 개념을 추가하며, 프로세서 배열에 걸쳐 실행될 코드를 생성합니다.멀티 코어 x86과 비교하여 10배 이상의 속도 향상을 제공할 수 있는 잠재력이 있습니다.
편집 - 계획: NVIDIA에서 일하지 않습니다.
최상의 성능을 위해 CUDA는 컴파일 시 정보를 원합니다.
따라서 템플릿 메커니즘이 가장 유용한 이유는 CUDA 컴파일러가 사용할 수 있는 컴파일 시간에 개발자가 말을 할 수 있는 방법을 제공하기 때문입니다.간단한 예를 들어, 컴파일 시간에 행렬이 2D 및 4 x 8로 정의(인스턴트)되면 CUDA 컴파일러는 이와 함께 프로세서 간에 프로그램을 구성할 수 있습니다.이 크기가 동적이고 프로그램이 실행되는 동안 변경되면 컴파일러나 런타임 시스템이 매우 효율적인 작업을 수행하기가 훨씬 더 어렵습니다.
편집: CUDA에는 클래스 및 함수 템플릿이 있습니다.만약 사람들이 이것을 CUDA가 그렇지 않다고 말하는 것으로 읽는다면 사과하겠습니다.제가 잘 몰랐다는 것에 동의합니다.
템플릿의 CUDA GPU측 구현이 완전하지 않다고 생각합니다. C++.
사용자 하르미즘은 제 대답이 오해의 소지가 있다고 논평했습니다.NVIDIA는 Harrism이 통하기 때문에 조언을 기다리겠습니다.이것이 이미 더 명확해졌으면 좋겠습니다.
여러 프로세서에서 효율적으로 수행하기 가장 어려운 작업은 코드를 효과적으로 직렬화하기 때문에 여러 대체 경로를 동적으로 분기하는 것입니다. 최악의 경우 한 번에 하나의 프로세서만 실행할 수 있어 GPU의 이점이 낭비되기 때문입니다. 따라서 가상 기능을 잘 수행하기는 매우 어려운 것으로 보입니다.
개발자가 이해할 수 있는 것보다 훨씬 더 많은 유형의 정보를 추론할 수 있는 매우 똑똑한 전체 프로그램 분석 도구들이 있습니다.기존 도구는 가상 기능을 제거할 수 있을 정도로 충분히 추론할 수 있으므로 분기 분석을 컴파일 시간으로 이동할 수 있습니다.더 나은 분기 결정에 도달할 수 있는 프로그램의 재컴파일로 직접 피드백하는 프로그램 실행 도구화 기술도 있습니다.
CUDA 컴파일러는 이러한 분야에서 아직 최첨단 기술을 가지고 있지 않습니다.
(IMHO는 CUDA 또는 OpenCL 지원 시스템에 관심 있는 사람이라면 누구나 며칠 동안 이를 조사하고 실험을 할 수 있는 가치가 있습니다.또한 이러한 분야에 관심이 있는 사람들에게는 Haskell을 실험하고 Data Parallel Haskell을 살펴보는 것이 가치 있는 일이라고 생각합니다.)
CUDA는 단일 프로그래밍 언어가 아닌 플랫폼(아키텍처, 프로그래밍 모델, 어셈블리 가상 머신, 컴파일 도구 등)입니다.CUDAC는 이 플랫폼에 구축된 여러 언어 시스템 중 하나일 뿐입니다(CUDAC, C++, CUDA Fortran, PyCUDA 등).
CUDA C++
현재 CUDA C++는 CUDA C 프로그래밍 가이드의 부록 D("C/C++ Language Support")에 설명된 C++의 서브셋을 지원합니다.
몇 가지 예를 들자면:
- 반
__device__멤버 함수(구성자 및 소멸자 포함)- 상속/파생 클래스
- 가상 함수
- 클래스 및 함수 템플릿
- 연산자 및 과부하
- 기능반
C는 을 으로 합니다: CUDA 7.0 CUDA C++ 는 C++11 합니다.__device__(드),합니다를 한 코드되는 코드)auto 범위 lambda , , , 정적 주장 등.
위에 링크된 동일한 부록에 예시 및 구체적인 제한 사항도 상세히 설명되어 있습니다.CUDA와 함께 C++를 사용하는 매우 성숙한 예로서, 스러스트를 확인하는 것을 추천합니다.
미래계획
(공개:NVIDIA에서 일합니다.)
향후 릴리스와 시기에 대해 명시적으로 말할 수는 없지만 CUDA의 거의 모든 릴리스가 CUDA C++ 지원을 현재 상태(매우 유용하다고 생각합니다)로 유지하기 위해 추가 언어 기능을 추가했다는 추세를 설명할 수 있습니다.우리는 C++에 대한 지원을 개선하는 방향으로 이러한 추세를 이어갈 계획이지만 자연스럽게 GPU(Massive Parallel Computational Architecture)에서 유용하고 성능이 뛰어난 기능을 우선시하게 됩니다.
많은 사람들이 깨닫지 못하고 있는 CUDA는 사실 C++에서 파생된 두 개의 새로운 프로그래밍 언어입니다.하나는 GPU에서 실행되는 코드를 작성하기 위한 것으로 C++의 하위 집합입니다.기능은 HLSL(DirectX)이나 Cg(OpenGL)와 비슷하지만 C++와 더 많은 기능과 호환성을 갖추고 있습니다.GPGPU/SIMT/성능과 관련된 다양한 고민들이 제가 언급할 필요가 없을 정도로 적용됩니다.다른 하나는 이른바 '런타임 API'로 전통적인 의미의 'API'라고 보기는 어렵습니다.런타임 API는 호스트 CPU에서 실행되는 코드를 작성하는 데 사용됩니다.이것은 C++의 수퍼세트이며 GPU 코드에 연결하고 시작하는 것을 훨씬 더 쉽게 해줍니다.NVCC 사전 컴파일러가 필요하며 이를 플랫폼의 C++ 컴파일러라고 부릅니다.이와는 대조적으로 드라이버 API(및 OpenCL)는 순수한 표준 C 라이브러리이며 사용하기에 훨씬 상세합니다(몇 가지 추가 기능은 제공하지 않음).
새로운 호스트측 프로그래밍 언어를 만든 것은 NVIDIA 입장에서는 과감한 조치였습니다.CUDA를 시작하는 것을 더 쉽게 하고 코드를 쓰는 것을 더 우아하게 만듭니다.하지만, 진정으로 훌륭한 것은 새로운 언어로 마케팅하는 것이 아니었습니다.
가끔 CUDA가 C와 C++일 것이라는 말을 들으실 수 있겠지만, 저는 그게 불가능하다는 단순한 이유 때문에 그렇게 생각하지 않습니다.그들의 프로그래밍 가이드에서 인용하자면:
호스트 코드의 경우 nvcc는 호스트 c++ 컴파일러가 지원하는 C++ ISO/IEC 14882:2003 사양의 어느 부분이든 지원합니다.
장치 코드의 경우 nvcc는 섹션 D.1에 설명된 기능을 지원하며 섹션 D.2에 설명된 몇 가지 제한 사항이 있습니다. 실행 시간 유형 정보(RTTI), 예외 처리 및 C++ 표준 라이브러리는 지원하지 않습니다.
제가 보기에는 C++만 언급하고 C와 C++의 교차점에 있는 C만 지원합니다.따라서 C보다는 디바이스 부분에 대한 확장 기능이 있는 C++라고 생각하는 것이 좋습니다.당신이 C에 익숙하다면, 그것은 당신이 많은 두통을 피할 수 있습니다.
엔비디아의 계획은?
일반적인 경향은 CUDA와 OpenCL이 많은 응용 프로그램에서 너무 낮은 수준의 기술로 간주된다는 것입니다.현재 Nvidia는 Open에 많은 투자를 하고 있습니다.대략 GPU용 OpenMP로 설명될 수 있는 ACC.선언적 접근 방식을 따르고 훨씬 높은 수준에서 GPU 병렬화 문제를 해결합니다.Nvidia의 계획이 무엇인지에 대한 저의 완전한 주관적인 인상입니다.
언급URL : https://stackoverflow.com/questions/9846523/explanation-of-cuda-c-and-c
'programing' 카테고리의 다른 글
| CSS3 애니메이션으로 눈 깜빡임 태그 따라하기 (0) | 2023.10.21 |
|---|---|
| Visual Studio 2015 Community의 SQL Server Object Explorer에 LocalDB를 추가하는 방법은? (0) | 2023.10.21 |
| MySql Query to Select a table, table을 반복하여 결과 테이블을 생성하기 위한 조건을 작성 (0) | 2023.10.16 |
| AutoPostBack= 간의 차이True 및 AutoPostBack= false? (0) | 2023.10.16 |
| jQuery DataTables를 사용할 때 마지막 열의 정렬 사용 안 함 (0) | 2023.10.16 |