3. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
정구범
http://blog.ninetiger.com
admin@ninetiger.com
질문이 있다면,
바로 E-Mail 주세요!
양찬무
http://coldmu.tistory.com
coldmu@naver.com
3
Who we are?
/GPGPU/WHO_WE_ARE
COLDMUNineTiger
4. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
4
Goal of Lecture
GPGPU, CUDA, OpenCL에 관해 알며,
원하는 모든 알고리즘의 Bruteforcing Toolkit 제작을
할 수 있다.
+매 Section마다의 기프티콘! 개이득!
4
/GPGPU/GOAL_OF_LECTURE
5. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
Content
발전 방향
GPGPU?
CPU vs GPU
Cuda vs
OpenCL
/GPGPU/CONTENT
GPGPU CUDA OpenCL TRAINING
Understanding
CUDA
How to install
CUDA
Hello World !
Understanding
OpenCL
Parallel
Programming
OpenCL
Architecture
Hello World !
OpenCL
Framework
SHA1
Demo
공인인증서
Q & A
5
6. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
발전 방향
1995년
/GPGPU/FUTURE_DIRECTION
6
7. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
발전 방향
매니코어가 전력 효율성이 높다.
/GPGPU/FUTURE_DIRECTION
7
입력 프로세서 출력
입력
f
정전용량 = C
전압 = V
동작주파수 = f
Power = CV2
𝑓
프로세서
프로세서
f/2
f/2
출력
f
정전용량 = 2.2C
전압 = 0.6V
동작주파수 = 0.5f
Power = 0.396CV2
𝑓
8. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
0
2
4
6
8
10
12
14
16
GFLOPS/Watt발전 방향
특화 칩이 전력 효율성이 좋다.
/GPGPU/FUTURE_DIRECTION
8
Intel 80-코어 테라급 프로세서
NVIDIA GTX 280
Intel Core2 쿼드
프로세서 (Q6700)
97W
236W
95W
9. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
9
매니코어 + 특화된 칩
= 이종 매니코어 플랫폼의 세상 도래
9
/GPGPU/FUTURE_DIRECTION
이런 플랫폼에 맞는 소프트웨어는
어떻게 설계할 것인가
10. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
GPGPU?
General Purpose Graphics Processing Unit
컴퓨터 그래픽스를 위한 계산만 다루는 GPU를
사용하여 CPU가 하던 프로그램들의 계산을 수
행하는 기술.
이를 가능하게 하는 것이 CUDA, OpenCL 이 있다.
/GPGPU/GPGPU?
10
11. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
CPU vs GPU
오직 계산을 위한 효율만 높여옴
나머지는 CPU에서 처리
i7의 10개를 합쳐야 나오는 성능.
/GPGPU/CPU_vs_GPU
11
12. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
CPU vs GPU
CPU 1 , 2, 4, 8, …
GPU 240 , 480, …
/GPGPU/CPU_vs_GPU
12
GPUCPU
13. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
그래픽 카드 안에 보
드, 메모리, GPU 모두
존재
제조사에서 개발 용이
발전 시간이 매우 빠
름
Ex) CPU와 대조적으로
그래픽카드는 GDDR5
CPU, 메인보드, 메모리
제조사가 다 다름
개발이 덜 용이
발전에 오랜 시간이 걸
림
Ex) 메모리 DDR1 >
DDR3
오랜 시간이 걸림
13
CPU vs GPU
/GPGPU/CPU_vs_GPU
CPUGPU
14. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
-호환성
+개발 단순
+호환성
-개발 복잡
14
CUDA vs OpenCL
/GPGPU/CDUA_vs_OPENCL
OpenCL
최근 들어,
cuda와 opencl은 10퍼센트미만의 차이점만을 가짐
즉, 무엇을 사용해도 큰 차이점을 보이지는 않는다.
CUDA
18. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
WHAT
IS THE
Contents?
UNDERSTANDING CUDA
HOW TO INSTALL CUDA
HELLO WORLD
/GPGPU/CUDA/WHATISTHECONTENTS
2
19. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
3
CUDA?
Data Processing
Load Calculation
TPC/SM/SP
Thread/Block/Grid
CUDA Function
Thread
Basic Function
Function Modifier
Understanding
CUDA
/GPGPU/CUDA/UNDERSTANDING_CUDA
20. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
CUDA?
Computer Unified Device Architecture
Nvidia사가 GPU를 이용한 범용적인 프로그램
을 개발 할 수 있도록 ‘프로그램 모델‘, ‘프로그
램 언어‘, ‘컴파일러‘, ‘라이브러리‘, ‘프로파일러
'를 제공하는 통합 환경을 구축.
2007년 2월에 통합 개발환경 CUDA 발표.
/GPGPU/CUDA/UNDERSTANDING_CUDA/CUDA?
4
21. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
5
CPU Data Processing
/GPGPU/CUDA/UNDERSTANDING_CUDA/DATA_PROCESSING
CPU
메인보드
메모리(DRAM)
FPU(실수 연산) ALU(정수 연산)
레지스터
LSU
입력 데이터 출력 데이터
22. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
6
GPU Data Processing
/GPGPU/CUDA/UNDERSTANDING_CUDA/DATA_PROCESSING
CPU
메인보드
메모리(DRAM)
입력 데이터 출력 데이터
그래픽 카드
GPU
데이터 처리
그래픽 카드 메모리(DRAM)
입력 데이터 출력 데이터
GPU 코어
코어
코어
코어
공유메모리
코어
코어
코어
코어
공유메모리
코어
코어
코어
코어
공유메모리
코어
코어
코어
코어
공유메모리
23. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
7
/GPGPU/CUDA/UNDERSTANDING_CUDA/LOAD_CALCULATION
Load Calculation
CPU를 이용한
처리 시간
GPU를 이용한
처리 시간
CPU를 이용한
처리 시간
GPU를 이용한
처리 시간
그래픽카드에서
PC로
출력 데이터
전송
PC에서
그래픽 카드로
입력 데이터
전송
실제 연산 시간 전체 프로그램 소요 시간
24. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
8
TPC / SM / SP
/GPGPU/CUDA/UNDERSTANDING_CUDA/LOAD_CALCULATION
TPC(Texture Processor
Cluster)
SM, Texture Unit, Controller
SM(Streaming Multiprocessor)
SP를 제어, 명령어 캐시, 데이
터캐시
SP(Streaming Processors)
1개의 코어
TPC
Texture Units
Geometry Controller
SMC
Texture L1
SM
I Cache
MT issue
C Cache
SP SP
SP SP
SFU SFU
Shared
Memory
SM
I Cache
MT issue
C Cache
SP SP
SP SP
SFU SFU
Shared
Memory
25. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
Thread / Block / Grid
스레드가 모여서 Block
Block이 모여서 GRID
Grid 2차원
Block 3차원
Dim3 Dg(3, 4, 1)
Dim3 Db(4, 3, 3)
Kernel <<< Dg, Db>>>(a,b,c)
/GPGPU/CUDA/UNDERSTANDING_CUDA/THREAD_BLOCK_GRID
Block(0,1)
Thread(0,0) Thread(1,0)
Thread(0,1) Thread(1,1)
Grid
Block(0,0) Block(1,0)
Block(0,1) Block(1,1)
9
26. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
10
CUDA Function
/GPGPU/CUDA/UNDERSTANDING_CUDA/CUDA_FUNCTION
__global__ void KernelFunction(int a, int b, int c)
{
// GPU 에서 실행되는 함수.
}
Void main()
{
KernelFunction (1, 2, 3);
}
<< < 블록, 스레드 >>>
27. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
Thread
CPU 환경에서는 CPU 코어 개수와 생성한
스레드 개수가 동일해야 최적의 효율을 냄.
스레드가 많아지면 시분할 스케줄을 시행하여 효율
떨어짐.
CUDA 환경에서는 무조건 잘 쪼개기만
하면 됨.
/GPGPU/CUDA/UNDERSTANDING_CUDA/Thread
11
28. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
코어의 제한
문맥교환이 비교적 오
래걸림.
레지스터 8~16개
매니코어
문맥교환의 정보 최소
화.
레지스터 SM마다
16,384개
스레드마다 16개 레지
스터 필요 -> 16,384/16
= 1024개
SM 30개 -> 1024 * 30 =
30,720개
12
Thread
/GPGPU/CUDA/UNDERSTANDING_CUDA/Thread2
CPU Context Switch GPU Context Switch
29. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
15
/GPGPU/CUDA/UNDERSTANDING_CUDA/Thread2
이름 : 콜드무
나이 : 24
성별 : 남
사과
음료수
총 : 10,000원
이름 : 나인타이거
나이 : 24
성별 : 남
과자
빵
총 : 5,000원
물품
사과
음료수
총 : 10,000원
물품
과자
빵
총 : 5,000원
30. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
코어의 제한
문맥교환이 비교적 오
래걸림.
코어마다 레지스터
8~16개
매니코어
문맥교환의 정보 최소
화.
레지스터 SM마다
16,384개
스레드마다 16개 레지
스터 필요 -> 16,384/16
= 1024개
SM 30개 -> 1024 * 30 =
30,720개
16
Thread
/GPGPU/CUDA/UNDERSTANDING_CUDA/Thread2
CPU Context Switch GPU Context Switch
31. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
Basic Function
cudaError_t cudaMalloc(void** devPtr, size_t count)
cudaError_t cudaFree(void* devPtr)
cudaError_t cudaMemcpy(void* dst, const void* src,
size_t count, cudaMemcpyHostToDevice);
cudaMemcpyHostToHost : PC메모리에서 PC메모리로
cudaMemcpyHostToDevice : PC메모리에서 그래픽 카드 메
모리로
cudaMemcpyDeviceToHost : 그래픽카드 메모리에서 PC메
모리로
cudaMemcpyDeviceToDevice : 그래픽카드 메모리에서 그
래픽카드 메모리로
/GPGPU/CUDA/UNDERSTANDING_CUDA/BASIC_FUNCTIOn
17
32. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
Function Modifier
/GPGPU/CUDA/UNDERSTANDING_CUDA/FUNCTION_MODIFIER
18
•디바이스에서 실행
•호스트에서 호출. 디바이스에서 호출 불가.__global__
•디바이스에서 실행
•디바이스에서 호출. 호스트에서 호출 불가.__device__
•호스트에서 실행
•호스트에서 호출. 디바이스에서 호출 불가.__host__
33. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
20
Download
Install
Settings
How to install
CUDA
/GPGPU/CUDA/HOW_TO_INSTALL_CUDA
34. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
21
/GPGPU/CUDA/HOW_TO_INSTALL_CUDA/DOWNLOAD
35. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
22
/GPGPU/CUDA/HOW_TO_INSTALL_CUDA/DOWNLOAD
36. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
23
/GPGPU/CUDA/HOW_TO_INSTALL_CUDA/INSTALL
37. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
24
/GPGPU/CUDA/HOW_TO_INSTALL_CUDA/INSTALL
38. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
25
/GPGPU/CUDA/HOW_TO_INSTALL_CUDA/INSTALL
39. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
26
Hello World !!!Hello World
/GPGPU/CUDA/UNDERSTANDING_CUDA
40. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
27
/GPGPU/CUDA/HELLO_WORLD/CREATE_SOLUTION
41. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
28
/GPGPU/CUDA/HELLO_WORLD/HELLO_WORLD
42. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
29
/GPGPU/CUDA/HELLO_WORLD/PARALLEL_CODE
43. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
30
/GPGPU/CUDA/HELLO_WORLD/PARALLEL_RESULT
44. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
Debugging
1 GPU
2 GPU
2 Computer
/GPGPU/CUDA/APPENDIX/DEBUGGING
31
&
45. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
Source
CUDA 병렬 프로그래밍 / 정영훈 저 / 프리렉 출
판사
https://developer.nvidia.com/cuda-
education-training (CUDA Online Training)
/GPGPU/CUDA/APPENDIX/SOURCE
32
46. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
33
Review: CUDA
1. 이름이 CUDA라고 정의된 이유?
2. CPU는 왜 코어갯수만큼 스레드를 생성하고,
GPU는 많이 쪼개도 될까?
3. 디바이스랑 호스트란?
33
/REVIEW/CUDA
48. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
저는 여러분들이
최대한 이해
하셨으면 좋겠습니다.
1. C언어를 해보셨습니까?
2. Windows/Linux/E.T.C API 공부를 해보셨습니까?
3. 프로세스, 쓰레드, 이벤트란 무엇인지 아십니까?
2
/GPGPU/OPENCL/BEFORE_START
50. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
4
OpenCL?
Understanding
OpenCL
GPGPU/OPENCL/UNDERSTANDING_OPENCL
51. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
5
OpenCL?
Open Computing Language
CPU, GPU등의 이종 프로세서들의 조합으로 구성된 컴
퓨터를 프로그래밍하기 위한 산업계의 표준 프레임워
크
OpenCL은 하드웨어를 우아한 추상화 뒤로 감추는 것
이 아니라 오히려 하드웨어를 노출시킴으로써 높은
수준의 이식성 제공.
즉, 이 말은 프로그래머가 플랫폼과 문맥 그리고 작업
을 서로 다른 디바이스들에 어떻게 스케줄할지에 대
해서 명시적으로 정의해야 한다는 것을 의미
GPGPU/OPENCL/UNDERSTANDING_OPENCL/OpenCL
52. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
6
병렬성과 병행성
Parallel Programming
Model
Why OpenCL use
parallel-model?
Parallel
Programming
/GPGPU/OPENCL/PARALLEL_PROGRAMMING
53. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
단순히 두 개 이상의
활성화된 연산 스트림
으로 구성
이들을 한꺼번에 진행
할 수 있다면, 병행성
이 있다고 할 수 있다.
병행적인 소프트웨어가 실
행의 기본 단위가 되는 하
드웨어 유닛인 Processing
Element를 여러 개 가진 컴
퓨터에서 여러 PE로 실제
로 동시에 실행될 때
즉, 하드웨어에 의해 병행
성이 지원될 때 병렬적이라
고 한다.
7
병렬성과 병행성
/GPGPU/OPENCL/PARALLEL_PROGRAMMING/병렬성과_병행성
병렬성 병행성
54. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
병렬성과 병행성
프로그래머는 병행성에 대하여 대단히 고민해야 한다.
/GPGPU/OPENCL/PARALLEL_PROGRAMMING/병렬성과_병행성
8
연산 스트림 정의 연산 데이터 연관 결과 종속성 만족
1~100 더하기 10개씩 10개로 나눔 결과들을 서로 더함
근의 공식 어떻게 쪼갤 것인지?
결과들을 어떻게
합칠 것인지?
따라서, 문제를 보다 쉽게 다루기 위해서, 모델링을 한다.
55. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
여러 병행적인 task들
을 프로그래머가 직접
정의하고 나누어 각
PE에 맵핑
부하조절 문제가 더욱
어려울 수 있다
9
Parallel programming model
/GPGPU/OPENCL/PARALLEL_PROGRAMMING/PARALLEL_PROGRAMMING_MODEL
Task-parallel
1
2
3 4
5 6
6개의 독립적인 Tasks
1
2
3
4
5
6
3개의 PE, 잘못된 부하조절
1
2
3
4
5
6
3개의 PE, 잘된 부하조절
끝나는
시간
56. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
동일한 명령어 스트림
을 가지고 병행적으로
데이터 요소에 적용
상대적으로 부하조절
문제가 적다
10
Parallel programming model
/GPGPU/OPENCL/PARALLEL_PROGRAMMING/PARALLEL_PROGRAMMING_MODEL
Data-parallel
6 1 1 0 9 2 4 1 1 9
36 1 1 0 81 4 16 1 1 81
A_Vector
A_Result
TASK(A[i])
TASK(A[i])
TASK(A[i])
단일 task가 병렬적으로 적용
57. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
Why OpenCL use parallel-model?
OpenCL은 CPU가 입출력 작업을 하고 다른 모든 작업
을 GPGPU에 맡기는 작업을 장려하지 않음
OpenCL은 매니코어와 이종 프로그래밍의 장점을 지
향
모든 OpenCL을 지원하는 디바이스들에 대한 접근을
허용함으로써, 추상화와는 반대적으로 접근
모든 OpenCL 디바이스를 활용한 효율적인 프로그래
밍 지향
/GPGPU/OPENCL/PARALLEL_PROGRAMMING/Why_OpenCL_use_parallel-model?
11
58. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
12
Platform Model
Execution Model
Memory Model
Programming Model
OpenCL 제약
OpenCL Component
OpenCL
Architecture
/GPGPU/OPENCL/OpenCL_ARCHITECTURE
59. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
Platform Model
이종 시스템에 대한 상위 수준의 기술
Host: 단 한 개. 모든 Compute Device들과 연결됨
Compute Device: =OpenCL Device, 명령어 스트림(커
널)이 실행되는 곳
Compute Unit: ≈작업 그룹
PE: 실제적인 계산이
이루어지는 곳
/GPGPU/OPENCL/OpenCL_ARCHITECTURE/PLATFORM_MODEL
13
60. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
Execution Model
Host Program: OpenCL 객체들과 상호 연동하는 프로
그램. OpenCL 명세에는 자세한 동작규약이 없다.
Kernel: 입력 메모리 객체를 출력 메모리 객체로 변환
하는 함수, 실제적인 작업을 수행
Command Queue: 커널과 데이터를 전송하는 순차/
비순차 큐
Work-item: PE에 의해 처리되는 커널의 인스턴스
Work-group: Work-item들의 집합
/GPGPU/OPENCL/OpenCL_ARCHITECTURE/EXECUTION_MODEL
14
61. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
Execution Model
1. OpenCL 플랫폼을 선택하고 문맥 생성하기
2. 디바이스들을 열거하고, 명령-큐 생성하기
3. 프로그램 객체를 생성하고 빌드하기
4. 커널 객체를 생성하고 커널 인자를 위해 메모
리 객체 생성하기
5. 커널을 실행하고 그 결과를 읽기
6. OpenCL에서의 에러 확인하기
/GPGPU/OPENCL/OpenCL_ARCHITECTURE/EXECUTION_MODEL
15
62. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
Memory Model
Private Memory
Per work-item
Local Memory
Per work-group
work-group안의 work-item끼리
공유가능
Global/Constant Memory
동기화 안됨
Host Memory
CPU, RAM …
/GPGPU/OPENCL/OpenCL_ARCHITECTURE/MEMORY_MODEL
16
63. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
Single Instruction Multiple
Data(SIMD)
동일한 명령에 데이터만
다른 것
Single Program Multiple
Data(SPMD)
같은 커널 실행, 작업 내용
이 여러가지 인 것
OpenCL은 Data-parallel을
기본으로 설계 됨
Kernel 내부 병렬성
비순차 큐 병렬성
선택적 구현 - 모든 플랫
폼에서 동작하지 않음
이벤트 모델 병렬성
17
Programming Model
/GPGPU/OPENCL/OpenCL_ARCHITECTURE/PROGRAMMING_MODEL
Task-parallel Model Data-parallel Model
64. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
OpenCL 제약
서로 다른 work-group의 work-item 사이의 동
기화 메커니즘을 제공하지 않음.
따라서, 이에 의존하는 알고리즘은 안전한 수
행을 보장 받지 못함
OpenCL의 구현상의 한계 때문에 OpenCL로 구
현할 수 없는 병렬 패턴이 존재할 수 있음
OpenCL Specification문서에서 더 많은 제약을 볼 수
있음
http://www.khronos.org/registry/cl/specs/opencl-1.x-latest.pdf#page=157
/GPGPU/OPENCL/OpenCL_ARCHITECTURE/OpenCL_LIMITATION
18
65. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
OpenCL Component
Platform API: 디바이스 찾기
Runtime API: 큐에 명령을 집어 넣는 함수등의 실행 중에 필요
한 모든 함수
Programming Language: OpenCL C, ISO C99의 확장. 이식성이
중요하기 때문에 CPU에서만 지원하는 기능 몇 가지를 제외.
> 재귀 함수, 함수 포인터, 비트 필드, 표준 라이브러리.
/GPGPU/OPENCL/OpenCL_ARCHITECTURE/OpenCL_COMPONETN
19
66. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
Review: OpenCL
1. OpenCL이 실행되는 과정을 아는 대로 말해 주세요!
2. OpenCL에서 Kernel과 Host를 설명해주세요!
20
/REVIEW/OpenCL/GA_2_DUT
67. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
OpenCL 이미지 출처
http://ahnlabsabo.tistory.com/1426
http://amd.com
http://www.khronos.org/assets/uploads/develope
rs/library/overview/opencl_overview.pdf
21
68. Goal of Lecture
GPGPU, CUDA, OpenCL에 관해 알며,
원하는 모든 알고리즘의
Bruteforcing Toolkit 제작!
+마지막 남은 제일 비싼 기프티콘!
개이득!
69. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
2
Favorite C IDE
OpenCL SDK
Boost Lib
Install
70. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
3
Build 환경 구축
Hello World 실행
Hello World Kernel 분석
Host Program 분석
Hello World !
/GPGPU/OPENCL/HELLO_WORLD
71. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
Build 환경 구축
OpenCL 지원 확인
CPU:
intel driver: SSE4.1~
AMD driver: SSE2.x~
GPU:
intel driver: HD 4000~
NVIDIA driver: 2009 year~https://developer.nvidia.com/cuda-gpus
AMD driver: 2009 year~http://developer.amd.com/tools-and-sdks/opencl-zone/opencl-tools-sdks/amd-accelerated-parallel-processing-app-sdk/system-requirements-driver-compatibility/
OpenCL SDK 설치
AMD APP SDK or Intel OpenCL SDK
AMD CodeXL (Only on AMD GPU)
Visual Studio에서 OpenCL 빌드
C/C++ > 추가 포함 디렉토리: C:Program Files (x86)AMD APP SDK2.9include
링커 > 추가 종속성: C:Program Files (x86)AMD APP SDK2.9libx86_64OpenCL.lib
프로젝트 메인 디렉토리: kernel.cl (실행시킬 Kernel 파일)
/GPGPU/OPENCL/HELLO_WORLD/INSTALL_OPENCL
4
72. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
Hello World 실행
i=0~
i + i*2 > 출력
/GPGPU/OPENCL/HELLO_WORLD/HELLO_WORLD
5
73. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
Hello World Kernel Analysis
모든 __(underbar 2개)는 생략가능
OpenCL C로 구현되어 있으며, 보통 .cl확장자를 가짐
__Kernel
OpenCL에서 쓰이는 커널함수 지시자
항상 void 리턴
__global
__local, __constant, __private(default)
가리킨 메모리가 어디에 할당된 메모리인가에 대한 지시자
get_global_id()
/GPGPU/OPENCL/HELLO_WORLD/HELLO_WORLD_KERNEL_ANALYSIS
6
6 1 1 0 9 2 4 1 1 9
get_work_dim = 1
get_global_size = 10
get_local_id = 2
get_num_groups = 2
get_group_id = 0 get_local_size = 5
get_global_id = 7
74. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
Host Program Analysis
OpenCL Platform 선택: CreateContext()
Device의 Command-Queue 생성: CreateCommandQueue()
프로그램 객체 생성 및 빌드: CreateProgram()
커널 객체 생성: clCreateKernel()
커널 인자=메모리 객체 생성: clSetKernelArg()
커널 실행을 위한 큐: clEnqueueNDRangeKernel()
값 읽기를 위한 큐: clEnqueueReadBuffer()
/GPGPU/OPENCL/HELLO_WORLD/HOST_PROGRMA_ANALYSIS
7
75. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
Host Program Analysis
clGetxxInfo() 사용법
cl_device_info flag
/GPGPU/OPENCL/HELLO_WORLD/HOST_PROGRMA_ANALYSIS
8
76. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
9
편리를 위해
멀티바이트 세팅
기본 cpp, cl 파일
CREATE EMPTY
CONSOLE PROJECT
77. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
10
정상적으로 되었는지
컴파일 해보고 테스트
통과 한다면
OpenCL 사용 가능 환경
INCLUDE
HEADER & LIBRARY
78. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
11
readKernelFile
try catch
build
함수 추가
ERROR: clCreateProgramWithSource(-30)
이 나오면 성공
platform = profile
context = device type
device = device
src = source
program = compilable/ed src
BASIC
HOST PROGRAM
79. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
12
program.build(devices);
가 성공해야 한다
SIMPLE
OPENCL KERNEL
80. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
13
result[500] == 250000
이면 성공
SIMPLE
HOST PROGRAM
82. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
15
GID2KEY ?
1. 큐를 사용하는 것은 매우 느리다?
2. GPGPU로 보내는데 매우 많은 시간이 걸린다?
3. 일 차원 배열을 사용하는 것은 처리에
매우 비효율 적이다?
88. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
21
cpp/cl 파일들을 교체
기존 파일들을 복붙함
OpenCL BruteForce Tool
Framework 완성
원하는 알고리즘을 자
신이 추가하여 완성
GID2KEY
89. GPGPU: Bruteforce is NOT DEAD ! // NineTiger && COLDMU
22
C SHA1 Source 확인
OpenCL C99 변환
예외 확인
몇 가지 수정 사항BRUTEFORCE
SHA1