CUDA에서 사용되는 일부 키워드들을 정리하였습니다.

__restrict

  • CUDA 커널에서 인자로 제공되는 포인터에 주로 붙는 키워드이다.
  • pointer aliasing이라고 인자로 제공된 메모리가 프로그램 내의 다른 단계에서 동시에 읽혀지거나 쓰여지는 것을 말한다. 이것은 보통 버그를 만들게 되기 때문에 일반적으로 많은 검사를 하게한다.
  • 이러한 검사는 불필요하게 하기 때문에, __restrict 키워드를 붙이면 컴파일러에게 포인터에 aliasing이 일어나지 않으며, 좀더 극단적인 최적화에 안전하다는 것을 알려줄 수 있다.
  • 그래서 가능하면 붙이는 편이 효율적이다.
  • 이게 실제로 잘 먹히는 것은 C++17 이후의 modern C11 부터 가능하다.
  • 또한 C++ 컴파일러가은 __restrict 대신에 _restrict를 사용할 수도 있다.
  • 무조건 포인터 뒤에 붙는다.

const

  • 커널함수에서 그다지 큰 성능향상을 주지는 않는다.
  • 그저 변수에 대한 우연한 오버라이팅등을 막는 역할일 뿐이다.
  • 또는 프로그래머의 의도를 표현한다.
  • const 포인터 변수 : 변수를 상수화 하겟다는 뜻이다. 다만 포인터를 통해서 변수에 접근하는 것만 상수화한다. ex)
  const int* a = #
  *a = 1; // compile error
  num = 1; // ok
  • 포인터 const 변수 : 포인터를 상수화하겠다는 뜻이다. 즉 포인터 variable에 다른 값을 넣는게 불가능하다.

최종수정일 : 2023년 10월 28일