010-CUDA, Complex 04, Operator Overloading 1/2 for Complex Numbers

preview_player
Показать описание
C++ Library Extensions

Before Filming Video

After Filming Video

OpenGL Tools

1. gl-tools (10 MB)

2. OpenGL Programming Guide: The Official Guide to Learning OpenGL, Version 4.5 with SPIR-V 9th Edition

Prebuilt Library (123 MB):

3. OpenGL Superbible: Comprehensive Tutorial and Reference 7th Edition

Prebuilt Library (104 MB):

OpenGL & CUDA Command Line

039- (SETUP) OpenGL Windows Command-line, Windows on Command Prompt, /SUBSYSTEM:console

Previous Series on OpenGL and CUDA

1. (English) C++ Electricity and Magnetism, Vector Calculus (2023.02.19 - 2023.09.03) - 81 videos

2. (English) C++ 17/20/23/CUDA/SYCL/OpenGL/OpenCL/TBB (2022.06.17 - 2023.02.18) - 237 videos

3. (Korean) Vector Calculus and Electromagnetism with OpenGL (2023.05.15 - 2023.09.23) - 87 videos

4. (Korean) CUDA, SYCL, OpenGL, OpenCL, MFC (2022.02.18 - 2022.08.17) - 156 videos

125 - Numerical Analysis 18 - process_lambda, thrust::tuple, range


5. (Korean) C++ Parallel Heterogeneous Compute in 2022 (2021.12.12 - 2022.02.18) - 58 videos

Previous Videos in the Current Playlist

(Korean) 001- (SETUP) Hello CUDA Functional Programming 및 OpenGL 3D Graphics

(Korean) 002- CUDA, cudavars, evaluate, argument_count, parameter_count_v, call_redirect

(Korean) 003- CUDA Functional Programming, call_redirect()

(Korean) 004- CUDA Debugging, aout, dim, Cuda_TypeName, Cuda_TypeCategory, Cuda_PackName, Cuda_FunctionName

(Korean) 005- CUDA, 복소수 함수 미분법, Cauchy-Riemann Equations, random complex, cplx, Holomorphic function

(Korean) 006- CUDA, Complex Derivative CPU (Host) Implementation, Fundamental Theorem of Algebra

(English) 007- CUDA, Complex 01, C++20 Concepts, parameter_count_v, argument_count

CUDA thrust library

thrust::tuple

thrust::pair

Download Current Video's Source Code
Рекомендации по теме
Комментарии
Автор

영상 감사합니다
영어 채널로 이동하셨네요
// Class Template Argument Deduction Guide or CTAD
template<cpt::number_c Type>
__device__ complex(Type r)
-> complex< std::common_type_t<Type, float>, std::common_type_t<Type, float>>;
__device__ =>cuda kernel에서 동작, complex 함수를 template override 하여 실수만 받을 수도 있고, 실수와 허수를 동시에 받을 수 있도록 클래스 템플릿 인자 추론 가이드
// primary template 은 false_type을 상속받고
template<typename Type>
struct st_floating_complex: std::false_type { };

specialization은 true_type을 상속받아서 처리
template<std::floating_point Type>
struct st_floating_complex< complex<Type, Type> >: std::true_type { };

template<typename Type>
concept floating_complex_c =
hidden::st_floating_complex< std::remove_cvref_t<Type> >::value;

std::remove_cvref_t<Type>은 Type에서 const, volatile, 및 참조(&, &&)를 제거한 타입이고
hidden::st_floating_complex는 Type이 실수 복소수인지 여부를 판별하는 템플릿 구조체,
value는 구조체의 정적 멤버 변수로, Type이 실수 복소수이면 true로, 아니면 false를 반환함
template<typename Type>
concept number_function_or_complex_c =
cpt::number_c<Type> || cpt::function_c<Type> || complex_c<Type>;
number_function_or_complex_c concept 은
Type이 숫자, 함수, 복소수 인지를 판별하는 concept

template<typename... Types>
concept all_complex_c = ( complex_c<Types> && ... ); //fold expression
여러개의 가변 template argument가 전달되면 conjuction(&&)를 fold를 풀어서 전체가 다 복소수일 경우만 value가 true로 반환함

template<typename... Types>
concept at_least_one_complex_c = (complex_c<Types> || ...);
여러개의 가변 template argument가 전달되면 disjuction(||)를 fold를 풀어서 적어도 하나의 인자만 복소수 인지 판별하여 value가 true로 반환함
// accessor - getter
__device__ auto real() const noexcept
{
return static_cast< std::complex<EleType> const& >(*this).real();
}
*this는 현재 객체를 가리키는 포인터
*this를 std::complex<EleType> const&으로 형변환하여 복소수로 형변환하여 real 메서드만 반환함
외부에서 멤버변수에 바로 접근하지 못하게 하고 real() 함수를 호출 하도록 설계됨, setter는 외부에서 멤버변수를 바로 수정하지 못하고 setter를 통해서 인자를 받아서 real 함수에 인자를 전달하면 그 인자값이 멤버변수의 값을 변경함
함수의 인자로 전달되는 파라미터의 갯수를 판단하기 위해 constraint를 걸어서 처리함
아래 코드는 이전 한글 채널에서 설명해주심
__device__ auto evaluate(fType&& f, std::tuple<ArgTypes...> arguments)
{
using ArgType =
std::common_type_t< >;

constexpr auto pCount =
cpt::parameter_count_v<fType, ArgType>;

return [&f, &arguments]
<auto... i> (std::index_sequence<i...>)
{
return f( std::get<i>(arguments)... );

}( std::make_index_sequence< pCount >{} );
}

감사합니다

jaeohlee