예제 코드에 대해서 질문 드립니다.
안녕하세요!
38-4 강의를 수강하고 예제 코드를 확인하는 과정에서 몇 가지 궁금증이 생겨 질문을 드립니다.
kernel 함수 내 변수에서 register를 붙이시던데 이렇게 붙였을때 이점이 있을까요?
두 번째 for문 같은 경우에 halfsize *= 2 이렇게 표현할 수 있는데 비트연산으로 나타 내시던데 이유를 알 수 있을까요??
변수를 선언할때 unsigned 만 작성하시던데 이것도 이유가 있을까요??
어찌 보면 굉장히 사소할 수 있는 질문들이지만, 그래도 이유를 알면 배울 수 있는 부분이 많을거 같아 질문 드립니다.
Answer 1
1
안녕하세요.
우선, 강의를 수강해 주셔서 감사합니다.
프로그래밍은 습관으로 되어 있기도 해서, 크게는 제 프로그래밍 습관으로 보셔도 될 겁니다.
1. kernel 내 변수들은 사실 대부분 GPU core 의 register 로 할당되고,
일부, array 변수들이나, 변수 숫자가 너무 많아지면, GPU local memory 에 할당되는 방식입니다.
그래서,
(1) array 변수가 아닌 경우에는 register 에 할당될 것이라는 것을 제가 remind 하려는 의도가 있고,
(2) 일반 변수가 많아지는 경우에는, 중요도에 따라, compiler 에게 우선적으로 register 에 할당해 달라는 요청으로 붙이기도 합니다.
(2) 번의 경우는, 사실 C++ / C 컴파일러에서도 register 키워드를 힌트로 받아들이기 때문에, 같은 의도에서 붙이는 편입니다.
2. halfsize *= 2; 로 하나, halfsize <<= 1; 로 하나, 사실 하는 일은 똑같습니다.
다만, 역사적인 이유로, 예전의 compiler 들이 * 2 를 곧이곧대로, 곱하기 루틴을 부르거나, 기계어의 곱하기 명령을 사용했고,
그것보다는 bit 단위 shift 연산 쪽이 더 빨라서, compiler 가 optimize를 제대로 못하는 경우에도 대비하는 경향이 있었습니다.
저도 습관적으로 bit 단위 shift 연산 쪽을 선호합니다만, 최신 컴파일러에서는 자동으로 optimize 해 주기 때문에, 사실상 차이가 없을 겁니다.
그래서, 현재는 그냥 옛날의 습관으로 보시면 되겠습니다.
3. loop count 같은 경우에, 저는 unsigned 쪽을 선호합니다.
이것도 크게 이유가 있는 것은 아니고, 분명히 positive number 만 들어가야 하는 경우에는 unsigned 로 선언해 두면,
debug 할때, 조금 더 빨리 문제를 파악하는 경우가 많아서, 이쪽을 선호합니다.
예를 들면, scanf 등에서, unsigned int 로 읽어 들이게 하면, -1 같은 값을 아예 입력하지 못하게 해서,
혹시라도 - 를 오타로 넣거나, 처음 설계와는 달리 minus 값을 넣으면, 아예 처음부터 문제라고 인식하게 하는 편입니다.
역시 프로그래밍 습관으로 보시면 되겠습니다.
감사합니다.
재귀함수 연산법
0
6
1
3-F 채점 관련 질문
0
4
0
BFS, DFS 활용이 되는 상황에서의 방향성
0
5
1
코딩살구클럽 승인
0
13
1
코딩살구클럽승인
0
10
1
리눅스로 진행해도 될까요?
0
20
2
코딩살구클럽 승인
0
43
2
3-D 관련 질문
0
33
2
코살구 회원가입 문의
0
38
2
코살구 로그인 문제
0
60
2
26년 1회차 기출 강의
0
55
2
3-A 문제 풀이 관련 질문
0
51
3
2-O 질문 있습니다
0
38
2
2-T 문제에 관한 질문
0
38
2
코딩 살구 클럽 접속 및 사용방법 문의
0
57
2
기출문제
0
55
1
안녕하세요~. 현재 코살코딩클럽 사이트가 접속이 안됩니다~
0
64
2
코딩살구클럽 로그인문제
0
74
3
정보처리기사 실기 zip
0
44
2
데이터베이스 노션
0
38
2
수업노선자료파일 다운
0
34
2
코딩 살구 클럽 로그인 문제
0
79
2
예제를 돌려보고 싶은데 common.cpp은 어디에 있을까요?
0
360
1
39g-merge-global-large.cu에 대해서 질문드립니다.
0
379
1

