• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

예제 코드에 대해서 질문 드립니다.

23.03.20 00:45 작성 조회수 268

0

안녕하세요!

38-4 강의를 수강하고 예제 코드를 확인하는 과정에서 몇 가지 궁금증이 생겨 질문을 드립니다.

  1. kernel 함수 내 변수에서 register를 붙이시던데 이렇게 붙였을때 이점이 있을까요?

  2. 두 번째 for문 같은 경우에 halfsize *= 2 이렇게 표현할 수 있는데 비트연산으로 나타 내시던데 이유를 알 수 있을까요??

  3. 변수를 선언할때 unsigned 만 작성하시던데 이것도 이유가 있을까요??

어찌 보면 굉장히 사소할 수 있는 질문들이지만, 그래도 이유를 알면 배울 수 있는 부분이 많을거 같아 질문 드립니다.

답변 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 값을 넣으면, 아예 처음부터 문제라고 인식하게 하는 편입니다.

역시 프로그래밍 습관으로 보시면 되겠습니다.

 

감사합니다.

박 신석님의 프로필

박 신석

질문자

2023.03.20

답변 감사합니다!