c++ cuda 예제

포인터 x와 y는 일반적인 방식으로 malloc으로 할당된 호스트 배열을 가리키며, d_x 및 d_y 배열은 CUDA 런타임 API에서 cudaMalloc 함수로 할당된 장치 배열을 가리킵니다. CUDA의 호스트와 장치에는 별도의 메모리 공간이 있으며, 둘 다 호스트 코드에서 관리할 수 있습니다(CUDA C 커널은 이를 지원하는 장치에 장치 메모리를 할당할 수도 있음). GPU에서 계산하려면 GPU에서 액세스할 수 있는 메모리를 할당해야 합니다. CUDA의 통합 메모리를 사용하면 시스템의 모든 GPU와 CPU에서 액세스할 수 있는 단일 메모리 공간을 쉽게 사용할 수 있습니다. 통합 메모리에 데이터를 할당하려면 호스트(CPU) 코드 또는 장치(GPU) 코드에서 액세스할 수 있는 포인터를 반환하는 cudaMallocManaged()를 호출합니다. 데이터를 확보하려면 포인터를 cudaFree()로 전달하면 됩니다. 커널을 실행한 후 결과를 호스트로 다시 가져오기 위해 cudaMemcpyDeviceToHost를 사용하여 y가 가리키는 호스트 배열로 d_y가 가리키는 장치 배열을 복사합니다. 엔비디아/cuda 샘플에서 새로운 릴리스에 대한 알림을 원하십니까? CUDA 프로그램을 컴파일하는 것은 C 프로그램과 유사합니다. NVIDIA는 CUDA 툴킷에서 nvcc라는 CUDA 컴파일러를 제공하여 일반적으로 .cu 확장자가 있는 파일에 저장된 CUDA 코드를 컴파일합니다. 예를 들어 호스트와 장치 메모리 간의 날짜 전송은 C의 memcpy와 유사한 cudaMemcpy 함수를 통해 수행 할 수 있습니다. cudaMemcpy의 구문은 cudaMalloc() 장치 메모리에 크기 수의 메모리를 할당 하 고 할당 된 메모리에 장치 포인터 devPtr업데이트 합니다. cudaFree() 는 장치 포인터 devPtr이 가리키는 장치 메모리 영역을 할당 합니다. C의 malloc() 및 free()와 비슷하며, 각각 CUDA C 컴파일러 nvcc는 NVIDIA CUDA 툴킷의 일부입니다.

SAXPY 예제를 컴파일하려면 .cu 확장명이 있는 파일에 코드를 저장합니다.saxpy.cu. 그런 다음 nvcc로 컴파일 할 수 있습니다. TARGET_ARCH= – 특정 아키텍처를 대상으로 하는 교차 컴파일입니다. 허용된 아키텍처는 x86_64, ppc64le, armv7l, aarch64입니다. 기본적으로 TARGET_ARCH는 HOST_ARCH로 설정됩니다. x86_64 컴퓨터에서 TARGET_ARCH를 설정하지 않는 것은 TARGET_ARCH=x86_64를 설정하는 것과 같습니다. $ TARGET_ARCH = x86_64 $ 하게 TARGET_ARCH = ppc64le $ TARGET_ARCH = armv7l $ TARGET_ARCH = aarch64 cuda 샘플의 크로스 플랫폼 컴파일에 대한 자세한 내용은 여기를 참조하십시오. 장치 배열을 초기화하기 위해, 우리는 단순히 복사의 방향을 지정하는 네 번째 인수를 소요하는 것을 제외하고, 표준 C memcpy 함수처럼 작동하는 cudaMemcpy를 사용하여 해당 장치 배열 d_x 및 d_y에 x와 y의 데이터를 복사합니다. 이 경우 cudaMemcpyHostToDevice를 사용하여 첫 번째 (대상) 인수가 장치 포인터이고 두 번째 (원본) 인수는 호스트 포인터임을 지정합니다. 작업이 완료되면 할당된 메모리를 해제해야 합니다. cudaMalloc()로 할당된 장치 메모리의 경우 cudaFree()를 호출하기만 하면 됩니다. 호스트 메모리의 경우 평소와 같이 free()를 사용합니다.

다음은 C(./vector_add.c)에서 구현된 벡터 추가의 예입니다. 이 예제에서는 배열 a와 b에 저장된 두 벡터의 추가를 계산하고 결과를 배열에 배치합니다. CUDA에 대한 자주 묻는 질문에 대한 답변은 http://developer.nvidia.com/cuda-faq 및 CUDA 툴킷 릴리스 노트에서 찾을 수 있습니다.