분류 전체보기 45

True sharing / False sharing : std::hardware_..._interference_size

True sharing / False sharing : std::hardware_..._interference_size 1. 설명 False sharing은 2개 이상의 코어가 서로 다른 메모리 주소에 접근하지만, 두 주소가 동일한 캐시 최소 단위에 적제되어 있어(논리적으로는 전혀 영향이 없지만 캐시는 이를 모르기에) 동기화가 이루어져 성능이 하락하는것을 말합니다. True sharing은 false sharing과는 반대로 동일한 메모리 주소에 값을 쓸때를 의미합니다. 이때는 당연히 동기화가 이루어지기에(논리적으로도 그것이 맞고) 이번글에서는 딱히 다루지 않겠습니다. C++17 에는 이렇게 동일한 캐시라인에 적제되는지 판별할수 있는(L1 캐시 라인 크기를 얻어오는) 표준이 추가되었습니다. 다만, 아직까..

C++/개념(Concept) 2021.08.30

Tensorflow Lite 실행하기(PC/C++)

Tensorflow Lite 실행하기(PC/C++) C++라이브러리를 빌드하는법은 여기를 참고해주세요! 이 글에서는 CMake를 사용해서 C++프로젝트를 빌드하였습니다. 1. CMake 프로젝트 생성 우선, CMake를 이용한 C++프로젝트를 생성합니다. CMakeLists.txt cmake_minimum_required(VERSION 3.5) project(20210829) set(CMAKE_CXX_STANDARD 14) add_executable(20210829 main.cpp) 2. Tensorflow Lite를 CMake 라이브러리로 만들기 여기에 Tensorflow Lite를 CMake 라이브러리로 연결을 해 볼 겁니다. 위 사진처럼 정석적인 CMake 라이브러리 구조를 만들어 줍니다. 이제 i..

Tensorflow Lite 를 C/C++로 빌드하기(bazel)

Tensorflow Lite 를 C/C++로 빌드하기(bazel) 1. Tensorflow Lite 다운로드 Tensorflow 공식 GitHub에 접속한 후, Release 탭에서 원하는 버전을 다운받습니다. https://github.com/tensorflow/tensorflow/releases Releases · tensorflow/tensorflow An Open Source Machine Learning Framework for Everyone - tensorflow/tensorflow github.com 여기서는 현재(2021.08.29)의 최신버전인 2.4.3을 사용하겠습니다. 제가 기억하기로는 1.X 부터 현재까지 빌드하는방법은 모두 동일한것으로 기억합니다. 혹시 본 글대로 했는데 에러가 ..

[BUG] Apple Clang std::hardware_xxx_interference_size

Apple Clang 컴파일러 버그 1. 설명 C++17부터는 true sharing 이 일어나는 메모리의 최대 크기와, 그 반대인 false sharing이 일어나는 메모리의 최소 크기를 얻어오는 표준이 지정되었습니다. Sharing은 보통 멀티스레드 환경에서 캐시 동기화때문에 일어나게 되는데, 보다 자세한 내용은 다른 글에서 다루도록 하겠습니다. 두 값 모두 실제 CPU의 캐시 라인과 관련이 있습니다. 하지만 실제로 이 표준을 구현하는 컴파일러는 2021년 8월 현재로써는 마이크로소프트의 컴파일러 뿐이고, 다른 계열들은 해당 표준을 구현하지 않았습니다. 대신 구현 여부를 매크로로 알아낼 수 있는데, Apple Clang에서는 해당 매크로조차 잘못 정의가되어 있는 상황입니다. 2. 예시 해당 표준이 구..

[BUG Report] MSVC(C++20) Closure type's special member function

마이크로소프트 컴파일러 C++20 feature 버그 1. 서론 C++20 에서 Closure type 이 이제 캡처가 없는 경우 특수 멤버 함수(기본 생성, 복사/이동 연산)를 제공하게 되었습니다. 여기서, 캡처가 없다는것은 실제로 내부에선 캡처된 객체를 사용하지 않더라도, 무조건 코드상에 캡처가 표시가 되어있는가를 기준으로 판단되어집니다. Proposal cppreference expr.prim.lambda_closure 2. 예시 int x = 1; auto lambda1 = []() { return 1; }; auto lambda2 = [&]() { return x; }; auto lambda3 = [&]() { return 1; }; 위에서 말했듯이, 실제 내부적으로 캡처된것이 사용되는지의 여부..

deleted 함수와 이동 연산의 overload resolution

deleted 함수와 이동 연산의 overload resolution 1. 설명 특수 멤버 함수는 경우에 따라 암시적으로 자동생성되지 않을 수도 있고, 혹은 명시적으로 삭제할수도 있습니다. 이러한 두 경우에 따라서 이동 연산(이동 생성, 이동 대입)이 overload 에 참여할 수도, 참여하지 않을 수도 있습니다. 그러면 경우에 따라 이동을 의도했지만 실제로는 복사가 일어나게 될 수 있으며, 성능 저하(대게는 프로그래머가 의도하지 않은)가 일어날 수 있습니다. 본 글에서는 편의를 위해 암시적으로 자동생성되지 않은 경우를 암시적 삭제로 부르도록 하겠습니다. 2. 예시 우선, 객체가 trivial 한 복사 및 이동연산을 지원한다면, 이동 연산은 무조건 복사 연산으로 대체됩니다. 사실 당연한 것입니다. tri..

C++/개념(Concept) 2021.05.30

CLion 에서 CMake Release 로 빌드하기

CLion 에서 CMake Release 로 빌드하기 CLion 은 기본적으로 CMake 를 사용하여 C++ 프로젝트를 빌드합니다(외부 플러그인을 사용해서 bazel 같은 것으로 빌드하게 바꿀 수 있습니다). 이때, CLion 을 이용해서 바로 프로젝트를 빌드 혹은 실행하면, (CMake가)Debug 모드에서 빌드 및 실행하게 됩니다. Debug 모드는 말그대로 소스 코드 디버깅(중단점, 호출 스택 조사, 변수 조사)을 할수 있게 해 주지만, 대신 프로그램 속도도 느려지게 됩니다. 이를 Release 모드로 빌드하면 프로그램 속도를 향상시킬 수 있습니다. 예시로 든건 MacOS 용 CLion 이지만, 다른 플랫폼에서도 동일하게 가능합니다. 설정으로 이동합니다. 좌측에 위와 같은 목록들이 나올 텐데, Bu..

Code Editor 2020.11.19

C++ 개념: 특수 멤버 함수(special member function)

특수 멤버 함수(Special Member Function) 1. 설명 클래스의 다음과 같은 멤버 함수들을 말합니다. 1. 기본 생성자(constructo) 2. 소멸자(destructor) 3. 복사 생성자 및 복사 할당(assignment)자 4. 이동 생성자 및 이동 할당자 소멸자는 명시적(explicitly)으로 삭제하지 않는 한, 무조건 생성됩니다. 소멸자를 제외한 5가지 항목은, 사용자가 명시적으로 삭제하지 않아도 암시적으로(implicitly) 삭제되는 경우가 있습니다. 2. 예시 ㄱ. 기본 생성자 #include class foo{ public: }; int main(){ auto f = foo(); foo f2; foo f3(); return 0; } 위 예시 처럼, 기본 생성자는 일반적..

C++/개념(Concept) 2020.11.16

C/C++ 개념: 전방 선언(forward declaration)

전방 선언(forward declaration) 1. 설명 함수나, 구조체, 열거자, 공용자, 외부(extern) 변수 (C++ 에서는 클래스도) 등을 그 실제 구현(implementation) 시점보다 앞서서 선언(declare)만 하는 것을 말합니다. 물론, 구현부와 선언부의 서명(signature)은 일치해야 합니다. 서로를 호출하는 함수, 외부(extern) 변수, PImple 기법 등에서 사용됩니다. 헤더와 소스 파일로 구현부, 선언부를 분리하는 행위는 기본적으로 모두 전방 선언에 속합니다. ※ main 함수보다 아래에서 구현된 함수를 호출할 때도 main 위에서 해당 함수를 전방 선언해야 합니다. 하지만 이런 케이스는 그냥 해당 함수를 main 위로 옮기면 되는 거라(원래는 다른 헤더 파일로 ..