-
카테고리
-
세부 분야
프로그래밍 언어
-
해결 여부
해결됨
예제 코드에 대해서 질문 드립니다.
23.03.20 00:45 작성 조회수 268
0
안녕하세요!
38-4 강의를 수강하고 예제 코드를 확인하는 과정에서 몇 가지 궁금증이 생겨 질문을 드립니다.
kernel 함수 내 변수에서 register를 붙이시던데 이렇게 붙였을때 이점이 있을까요?
두 번째 for문 같은 경우에 halfsize *= 2 이렇게 표현할 수 있는데 비트연산으로 나타 내시던데 이유를 알 수 있을까요??
변수를 선언할때 unsigned 만 작성하시던데 이것도 이유가 있을까요??
어찌 보면 굉장히 사소할 수 있는 질문들이지만, 그래도 이유를 알면 배울 수 있는 부분이 많을거 같아 질문 드립니다.
답변을 작성해보세요.
1
드립커피+한모금더
지식공유자2023.03.20
안녕하세요.
우선, 강의를 수강해 주셔서 감사합니다.
프로그래밍은 습관으로 되어 있기도 해서, 크게는 제 프로그래밍 습관으로 보셔도 될 겁니다.
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 값을 넣으면, 아예 처음부터 문제라고 인식하게 하는 편입니다.
역시 프로그래밍 습관으로 보시면 되겠습니다.
감사합니다.
답변 1