728x90

최근 tensorflow 2.0이 release 된 이후로, cuda 설치가 매우 간단해졌다.

(저는 cuda+cudnn 설치하는 시간 5분 걸렸습니다.)

 

Ubuntu 16.04 (CUDA 10) + cudnn + driver 설치

 

# Add NVIDIA package repositories
# Add HTTPS support for apt-key
sudo apt-get install gnupg-curl
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_10.0.130-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1604_10.0.130-1_amd64.deb
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
sudo apt-get update
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/nvidia-machine-learning-repo-ubuntu1604_1.0.0-1_amd64.deb
sudo apt install ./nvidia-machine-learning-repo-ubuntu1604_1.0.0-1_amd64.deb
sudo apt-get update

# Install NVIDIA driver
# Issue with driver install requires creating /usr/lib/nvidia
sudo mkdir /usr/lib/nvidia
sudo apt-get install --no-install-recommends nvidia-driver-418
# Reboot. Check that GPUs are visible using the command: nvidia-smi

# Install development and runtime libraries (~4GB)
sudo apt-get install --no-install-recommends \
    cuda-10-0 \
    libcudnn7=7.6.2.24-1+cuda10.0  \
    libcudnn7-dev=7.6.2.24-1+cuda10.0


# Install TensorRT. Requires that libcudnn7 is installed above.
sudo apt-get install -y --no-install-recommends libnvinfer5=5.1.5-1+cuda10.0 \
    libnvinfer-dev=5.1.5-1+cuda10.0

 

Ubuntu 16.04 (CUDA 9.0 for TensorFlow < 1.13.0) + cudnn + driver 설치

# Add NVIDIA package repository
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
sudo apt install ./cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/nvidia-machine-learning-repo-ubuntu1604_1.0.0-1_amd64.deb
sudo apt install ./nvidia-machine-learning-repo-ubuntu1604_1.0.0-1_amd64.deb
sudo apt update

# Install the NVIDIA driver
# Issue with driver install requires creating /usr/lib/nvidia
sudo mkdir /usr/lib/nvidia
sudo apt-get install --no-install-recommends nvidia-410
# Reboot. Check that GPUs are visible using the command: nvidia-smi

# Install CUDA and tools. Include optional NCCL 2.x
sudo apt install cuda9.0 cuda-cublas-9-0 cuda-cufft-9-0 cuda-curand-9-0 \
    cuda-cusolver-9-0 cuda-cusparse-9-0 libcudnn7=7.2.1.38-1+cuda9.0 \
    libnccl2=2.2.13-1+cuda9.0 cuda-command-line-tools-9-0

# Optional: Install the TensorRT runtime (must be after CUDA install)
sudo apt update
sudo apt install libnvinfer4=4.1.2-1+cuda9.0

위에는 cuda-10.0, 아래는 cuda-9.0 인데, 2개 모두 동시 설치 가능하다.

 

본인 계정 -> basrhc 에 들어가서 아래와 같이 사용할 버전을 typing 한다.

 

vi ~/.bashrc

export PATH=/mnt/junewoo/bin:/mnt/junewoo/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin 

# Path for cuda-9.0
export PATH=$PATH:/usr/local/cuda-9.0/bin



# Path for cuda-10.0

#export PATH=$PATH:/usr/local/cuda-10.0/bin



# Path for cudnn with cuda-9.0
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/junewoo/utils/cuda-9.0/lib64



# Path for cudnn with cuda-10.0
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:/mnt/junewoo/utils/cuda-10.0/lib64

 

만약 특정 폴더에 cudnn이 있을 경우(하지만 위의 명령어대로 설치할 경우 usr/local/cuda-n.m에 설치된다.

# Path for cudnn with cuda-10.0
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:/where/your_dir/cuda-10.0/lib64

그 뒤,

source ~/.bashrc



nvcc -V

 

확인해보면 설치된 cuda version 체크할 수 있다.

진짜 5분만에 설치할 수 있다 매우 간단...

 

ref: https://www.tensorflow.org/install/gpu?hl=ko

728x90
728x90

Machine을 이용 후 CUDA가 초기화가 되지 않거나, 잔여 메모리가 nvidia-smi 할 때 GPU에 남아 있는 현상이 가끔 일어나는데,


아래와 같이 python으로 하나 짜둔 뒤 실행해보면 처리가 된다.




initialized_machine.py



# status initialize

import os

os.environ['CUDA_VISIBLE_DEVICES'] = '1' // 초기화할 GPU number


# out of memory

import tensorflow as tf

with tf.Graph().as_default():

  gpu_options = tf.GPUOptions(allow_growth=True)



실행 : python3 initialized_machine.py


728x90
728x90

연구실 GPU 쿠다 마무리 작업 중,


나는 분명 cuda8, cuda9를 설치하였는데, nvcc --version 과 nvcc -V 를 쳤을 때 V7.5로 뜨는 것을 확인했다.


계속 이상하게 생각하던 도중...


torch를 설치 하고 있는데, 다음과 같은 에러가 떴다.


nvcc fatal   : Unsupported gpu architecture 'compute_61'

CMake Error at THC_generated_THCHalf.cu.o.cmake:207 (message):

  Error generating

  /home/lee/torch/extra/cutorch/build/lib/THC/CMakeFiles/THC.dir//./THC_generated_THCHalf.cu.o



lib/THC/CMakeFiles/THC.dir/build.make:560: recipe for target 'lib/THC/CMakeFiles/THC.dir/THC_generated_THCHalf.cu.o' failed

make[2]: *** [lib/THC/CMakeFiles/THC.dir/THC_generated_THCHalf.cu.o] Error 1

make[2]: *** Waiting for unfinished jobs....

nvcc fatal   : Unsupported gpu architecture 'compute_61'

CMake Error at THC_generated_THCTensorSortChar.cu.o.cmake:207 (message):

  Error generating

  /home/lee/torch/extra/cutorch/build/lib/THC/CMakeFiles/THC.dir/generated/./THC_generated_THCTensorSortChar.cu.o 블라블라...


nvcc fatal 문제 이다. nvcc 문제로 보는게 맞겠다.


나는 서버에서 거리가 좀 되고, 모니터는 무한 리부팅 문제를 해결하지 않아서, 원격으로 하기 때문에 display 로 보는 것이 힘들기 때문에 


vi ~/.profile 을 입력


맨 아랫줄에 다음과 같이 경로 설정을 해줬다.


export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH


닫고 난 뒤, source ~/.profile 을 해준다.


그러면 이제 경로 설정이 되어서 nvcc --version 을 할 경우 cuda 8 버전으로 잘 잡힌다.


연구실 서버 같은 경우 계정이 약 10개 정도 되는데, 일일이 다 해주기는 번거로운 일이다.


그 때, root 계정(superuser)로 접속하여


vi /etc/profile 을 입력


export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH



그 후 source /etc/profile 해주면 된다.


이렇게 되면 모든 계정에 대해 쿠다를 8로 잡아준다.


cuDNN 같은 경우에는 워낙 자료가 많으므로 생략


bashrc 로 하는 경우도 있는데, 마찬가지로 해주면 된다.




처음에 cuda9를 설치하고, 9 지원 안해주는 프레임워크가 있어서 uninstall 하지 않고 바로 설치했는데, 문제 없이 되는 것 같다.


cuDNN 도 7에서 6으로 바꿔서 설치했다. 마찬가지로 삭제하지 않고, 메뉴얼대로 따라 했을 뿐인데 잘 된다.


결론 : 굳이 삭제할 필요 없음

728x90
728x90

최근에 연구실에서 사용할 Cuda 를 찾아보다가, 최신 버전인 9.0을 설치하였고, cuDNN 7.0을 설치하였다.


그런데 위의 버전들은 torch 와 pytorch를 지원해주지 않는 것을 확인했다.


나는 tensorflow를 써서 상관이 없지만... 어쨋든 모두가 써야 하는 것이기에


cuda 8.0 버전을 설치하려고 nvidia developer 공식 사이트에 가보았지만 찾기가 힘들었다.


결국 구글링 끝에 주소를 찾았다...


https://developer.nvidia.com/cuda-toolkit-archive


cuDNN 예전 버전은 다음 사이트에서 받으면 된다.

(로그인이 필요함)


https://developer.nvidia.com/rdp/cudnn-download

cuda 9.0 과 cuDNN 7.0을 그대로 둔 상태에서 설치를 진행 할 것이다.


문제가 된다면 다음의 명령어를 통해 cuda 9.0 버전을 삭제하려고 한다.



To uninstall the CUDA Toolkit, run the uninstallation script provided in the bin directory of the toolkit. By default, it is located in /usr/local/cuda-9.0/bin:
$ sudo /usr/local/cuda-9.0/bin/uninstall_cuda_9.0.pl
To uninstall the NVIDIA Driver, run nvidia-uninstall:
$ sudo /usr/bin/nvidia-uninstall
To enable the Nouveau drivers, remove the blacklist file created in the Disabling Nouveau section, and regenerate the kernel initramfs/initrd again as described in that section.


아직 9.0 출시가 얼마 않되어 프레임워크 지원이 완벽하지 않은 것 같다...

728x90
728x90

CUDA (Computed Unified Device Architecture)는 NVIDIA에서 개발한 GPU 개발 툴이다. 사실 CUDA는 c, c++기반으로 짜여진 완전 기초적 H/W 접근을 해야하는데, 많은 연구자들이 딥러닝에 사용할 수 있도록, 쉽게 설치할 수 있도록 오픈하였다. 현재는 nvidia-driver, CUDA, CUDNN만 설치하면 딥러닝을 쉽게 사용할 수 있다. 


CUDA를 사용하는 이유는 매우 간단한데, 많은 양의 연산을 동시에 처리하는 것이 목표이다. 그러므로 딥러닝, 채굴과 같은 수학적 계산에 많이 쓰인다. 미분은 컴퓨터로 가능하기 때문이다.


기존의 컴퓨터 연산은 CPU를 사용하고, RAM에 의존하여 연산을 진행하였다. CPU를 이용한 연산은 대부분 Single-Core(Human-Brain)를 사용하고 MultiProcessing, Multi-Threading 등을 이용하여 CPU가 보유한 코어 갯수 만큼의 Multi-Core를 이용하여 연산을 할 수 있다. 일반적으로 딥러닝에서 사용하는, 특히 pytorch나 tensorflow 에서, data loader 파트에서, core 갯수를 주고 데이터 loading 하는 부분이 여기에 속한다.



이에 반해 GPU는 Core 갯수가 엄청나다. CPU는 8~16개인데 비해 GPU는 몇 천개 이상이다. 즉 이를 이용한 Many-Core dependent 연산을 진행하고, Video RAM에 있는 데이터를 연산한다.


각 각의 Core 별 속도는 CPU가 GPU보다 훨신 빠르다. CPU의 코어 당 속도가 3.0 GHz 정도이다. GPU 같은 경우, 16년 하반기에 등장한 Pascal Architecture 의 경우 1.8 GHz 로 많이 증가했으나 이전 Maxwell 2th Architecture에서의 속도는 0.9GHz 정도였다. 그렇지만 코어의 숫자는 이 때 당시의 CPU의 경우 집에서 게임하거나 사무용으로 쓰이는 평균의 개수는 4코어, GPU는 1500 코어 이상이었다.



많은 연구자들이 사용하는 python, matlab 같은 경우 행렬 연산을 사용할 수 밖에 없다. 이 때 쓰이는 것이 재귀연산 (recursive 연산)인데, 이 함수는 '직렬' 연산을 해야한다. 하지만 이런 경우가 아니고 단순 계산, 예를 들어 backpropagation을 진행하며 보는 미적분 같은 경우 병렬 연산을 해주는 것이 훨씬 효과적이다. 

행렬 연산



위의 경우 (4,4) 행렬이다. 연산이 더 빠른 직렬 연산의 경우에 대해 살펴보겠다. (1,1) 위치에 더해질 숫자 (1)를 입력 후 행/열 순으로 증가하며 previously adding 된 각 행에 더한다고 하면, (1,1) 위치의 덧셈 이후 (2,1)의 덧셈을 진행할 때 마찬가지로 이전에 더했던 값을 알아야 된다. 그러므로 연산이 순차적으로 진행되어야 한다. 이런 경우에는 병렬 연산에는 적합하지 않고, 단일 코어의 속도가 높은 CPU를 이용한 연산이 더 유리하다,


(4,4)행렬 모든 성분에 만약 1의 값을 더한다는 연산 process에 대해 논해보자. 직렬 연산의 경우 이 연산을 16번 (4,4 행렬이므로) 해야 끝나지만, 병렬 연산의 경우 16번의 연산을 병렬인 한 번에 처리한다. 즉 같은 값을 더해 주기 때문이다. 


앞서 언급한 CPU와 GPU의 코어 수, 속도로 살펴보았을 때, 코어 당 속도가 CPU가 GPU의 2배라고 가정하자. 이럴 경우 CPU로 연산하면 8의 시간이 걸린다고 하였을 경우(0.5 x 16), GPU를 이용하면 1의 시간이 걸린다. (1 x 1)


아래의 영상을 보면, NVIDIA에서 제공해주는 CPU와 GPU의 비교 영상이다.

NVIDIA에서 공개한 GPU vs CPU



https://youtu.be/-P28LKWTzrI

728x90
728x90

CUDA 병렬 프로그래밍 CUDA 병렬 처리

최근 GPGPU를 이야기함에 있어서 빠지지 않고 등장하는

CUDA에 대해서 알아보자

집에서 또는 연구실에서 사용하고 있는 Desk Top 컴퓨터에 그래픽 카드 한 장을 추가함으로 인해서 계산 및 Simulation 속도가 200배가 빨라 진다면 과연 사람들은 이 기술을 어떻게 받아 들일까?

엔비디아는 CUDA(Compute Unified Device Architecture)라는 기술을 2006 10월 웹에서 공개하면서 본격적으로 개인용 슈퍼 컴퓨터의 시대를 열어가려고 하고 있다.

오늘날의 GPU High Performance Computing(HPC)에 있어서 가장 적합한 솔루션이라고 평가되고 있으며 세상에서 가장 빠르게 확산이 되고 있는 기술 중에 하나이다특히 학술계산 분야에 있어서의 Heterogeneous Computing을 통해 시스템을 최적화함으로써 CPU Operating System, Task 처리와 같은 순차적인 업무를 위주로, GPU Massive Data를 처리하게 된다. GPU CPU대비 10배 가까운 메모리 인터페이스 Speed 240개의 Core에서 동시에 Data를 처리함으로써 최대 200배 이상까지도 계산 속도를 높일 수 있으며 또한 시스템을 최적화 시킬 수 있다.

 

CUDA ("Compute Unified Device Architecture", 쿠다)는

그래픽 처리 장치(GPU)에서 수행하는 (병렬 처리) 알고리즘을 C 프로그래밍 언어를 비롯한 산업 표준 언어를 사용하여 작성할 수 있도록 하는 GPGPU 기술이다.

CUDA는 엔비디아가 개발해오고 있으며 이 아키텍처를 사용하려면 엔비디아 GPU와 특별한 스트림 처리 드라이버가 필요하다. CUDA는 G8X GPU로 구성된 지포스 8 시리즈급 이상에서 동작한다. CUDA는 CUDA GPU 안의 명령셋과 대용량 병렬 처리 메모리를 접근할 수 있도록 해 준다.

개발자는 패스스케일 오픈64 C 컴파일러로 컴파일 된 '쿠다를 위한 C' (C언어를 엔비디아가 확장한 것) 를 사용하여 GPU 상에서 실행시킬 알고리듬을 작성할 수 있다.

 

쿠다 구조의 계산 인터페이스

쿠다 구조는 일련의 계산 인터페이스를 지원하며 이에는 OpenCL, DirectX Compute가 포함된다. C 언어가 아닌 다른 프로그래밍언어에서의 개발을 위한 래퍼(Wrapper)도 있는데, 현재 파이썬포트란자바와 매트랩 등을 위한 것들이 있다.

 

쿠다의 전망

쿠다를 통해 개발자들은 쿠다 GPU 안 병렬 계산 요소 고유의 명령어 집합과 메모리에 접근할 수 있다. 쿠다를 사용하여 최신 엔비디아 GPU를 효과적으로 개방적으로 사용할 수 있다. 그러나 CPU와는 달리 GPU는 병렬 다수 코어 구조를 가지고 있고, 각 코어는 수천 스레드를 동시에 실행시킬 수 있다. 응용 프로그램이 수행하는 작업(계산)이 이러한 병렬처리연산에 적합할 경우, GPU를 이용함으로써 커다란 성능 향상을 기대할 수 있다.

 

쿠다 적용

컴퓨터 게임 업계에서는 그래픽 랜더링에 덧붙여, 그래픽 카드를 게임 물리 계산 (파편, 연기, 불, 유체 등 물리 효과)에 사용된다.

쿠다는 그래픽이 아닌 응용 프로그램, 즉, 계산 생물학, 암호학, 그리고 다른 분야에서 10배 또는 그 이상의 속도 혜택을 가져왔다. 이 한 예는 BOINC 분산 계산 클라이언트 이다.

쿠다는 저수준 API와 고수준 API 모두를 제공한다. 최초의 CUDA SDK는 2007년 2월 15일에 공개되었으며 마이크로소프트 윈도와 리눅스를 지원했다. 맥 OS X지원은 2.0 버전에 추가되었다.

 

 

쿠다의 장점

1. 흩뿌린 읽기 - 코드가 메모리의 임의 위치에서 데이터를 읽을 수 있다.

2. 공유 메모리 - 쿠다는 고속 공유 메모리 지역 (16 또는 48KB 크기) 을 드러내어 스레드 간에 나눌 수 있게 해 준다. 이는 사용자 관리 캐시로 사용될 수 있는데, 텍스처 룩업을 이용하는 경우 보다 더 빠른 대역폭이 가능해진다.

3. 디바이스 상의 읽기, 쓰기가 호스트보다 더 빠르다.

4. 정수와 비트 단위 연산을 충분히 지원한다. 정수 텍스처 룩업이 포함된다.

 

쿠다의 예

 

 

 

 

 

쿠다의 제한

  • 재귀호출, 함수 포인터가 없는 C 언어의 하부 집합을 확장하여 사용한다. 그러나 한개의 처리 장치가 여러개의 쪼개진 메모리 공간에 대하여 작업하여야 하는 점이 다른 C 언어 실행 환경과 다른 점이다.
  • 텍스처 랜더링은 지원 되지 않는다.
  • 배정도에 관해서는 IEEE 754 표준과 다르지 않다. 단정도에서는 비정상값과 신호 NaN이 지원되지 않고, IEEE 반올림 모드 가운데서는 두가지만 지원하며, 이도 명령어에 따라서 지원되는 것으로 제어 단어(Control word)에서 지원 되는 것은 아니다.(이것이 제한점인지는 논란의 대상이 될 수 있다) 그리고 나눗셈과 제곱근의 정밀도가 단정도에 비해 조금 낮다.
  • CPU와 GPU 사이의 버스 대역폭과 시간 지연에서 병목이 발생할 수 있다.
  • 스레드가 최소한 32개씩 모여서 실행되어야 최선의 성능 향상을 얻을 수 있으며, 스레드 수의 합이 수천개가 되어야 한다. 프로그램 코드에서의 분기는, 각각의 32 스레드가 같은 실행 경로를 따른다면, 성능에 큰 지장을 주지 않는다. SIMD 실행 모델은 어떠한 내재적으로 분기하는 임무에게는 심각한 제한이 된다. (예를 들어, 광선 추적 가속 자료 구조)
  • 쿠다 기반 GPU는 엔비디아에서만 나온다.
  •  

     

    CPU와 GPU의 개념적 차이

     

     

    CUDA 컴파일 환경

     

    컴파일 워크플로우

    nvidia CUDA

    기존의 개발환경에서는 GPGPU를 위해서 C/C++에서 그래픽 하드웨어를 컨트롤 하기 위해 Cg, DirectX, OpenGL 등의 쉐이더 명령어를 사용해야 한다이러한 방법의 단점은 그래픽에 대한 API의 복잡성으로 인하여 쉽게 프로그래밍 하기 어렵다는 단점이 있다. CUDA는 이러한 단점을 해결하기 위한 방법인데이를 위해 좀더 쉬운 명령어 셋을 C언어에 추가하고추가된 명령어는 NVCC를 통해 GPU컨트롤이 가능한 Assemble 코드인 PTX Assemble 코드로 변환하여 사용할 수 있도록 한다.

     

    이러한 과정은 복잡해 보일 수 있는데, C언어 기반의 기존 컴파일러와 CUDA 명령어를 컴파일 할 수 있는 NVCC 컴파일러 두 개가 각 시스템에 맞는 오브젝트 파일이 만들어지고최종 결과물은 하나의 실행파일이 만들어 진다여기서 cudafe CUDA Front End의 약자로 사용되었다.

     

     

     

    CUDA C/C++에 확장된 명령어 셋이다표준 C/C++ 이외의 CUDA만의 Syntax가 존재하는데이는 기존 C Compiler에서는 작동하지 않고 NVCC에서만 인식하여 컴파일하게 된다명령어 확장 셋으로는 크게 4가지로 나뉘는데, Kernel 실행 시 사용되는 Triple Bracket, 함수 관리 선행어메모리 관리 선행어, CUDA 내장 구조체와 변수들이다.

     

     

    CUDA 병렬처리의 간단한 샘플

     

     

     

    #include <stdio.h>

    __global__ void arrtest(int *d_a)
    {
     int a;
     int b;
     int i=blockIdx.x * blockDim.x + threadIdx.x;
     int j=blockIdx.y * blockDim.y + threadIdx.y;
     int test[25]={5,5,2,6,3,
        3,5,2,4,4,
        1,3,5,2,3,
        3,4,2,3,1,
        5,2,3,2,1};
     int test1[25]={1,2,1,2,1,
        2,1,2,1,2,
        1,2,1,2,1,
        2,1,2,1,2,
        1,2,1,2,1};

     for(a=0;a<5;a++)
     {
      b+=test[j*5+a]*test1[i*5+a];
     }
     d_a[i*5+j]=b;
    }
    int main(int argc, char** argv)
    {
     int i;
     int *d_a;
     int *h_a;
     int test[25]={1,2,1,2,3,1,2,3,2,1,1,2,3,1,2,3,2,2,1,2,1,2,3,2,3};

     size_t memsize=5*5*sizeof(int);
     h_a=(int *)malloc(memsize);
     cudaMalloc((void **)&d_a, memsize);

     for(i=0;i<25;i++)
      h_a[i]=test[i];
     /**h_a=*test;*/

     dim3 dimgrid(1,1);
     dim3 dimblock(5,5);
     cudaMemcpy(d_a, h_a, memsize, cudaMemcpyHostToDevice);
     arrtest<<<dimgrid,dimblock>>>(d_a);
     cudaMemcpy(h_a, d_a, memsize, cudaMemcpyDeviceToHost);
     
     for(i=0;i<25;i++)
      printf("%d ",h_a[i]);
     printf("\n");

     scanf("%d ",&i);

     cudaFree(d_a);
     free(h_a);

     

     

     

    CUDA Documents

    http://docs.nvidia.com/cuda/index.html

     

    CUDA Toolkit

    https://developer.nvidia.com/cuda-toolkit-31-downloads

     

     

    CUDA 관련 영상

     

     

     

     

     

     

     

    [출처] CUDA 병렬 프로그래밍|작성자 치국바보

    www.miruware.com

    위키피디아

    youtube 


    728x90

    + Recent posts