百度收录网站之后又怎么做如何用群晖做自己的网站

张小明 2026/1/1 19:23:04
百度收录网站之后又怎么做,如何用群晖做自己的网站,网站建设软件,使用什么工具什么步骤完成网站的设计与建设1⃣ 跨平台架构目标#xff08;Cross-Platform Architecture Goals#xff09; 在设计跨平台系统时#xff0c;目标包括#xff1a; 充分利用各个平台特性 不仅考虑功能#xff0c;还要利用不同平台的性能优化和特性。 关注编译器特性 利用编译器提供的优化、警告、概念…1⃣ 跨平台架构目标Cross-Platform Architecture Goals在设计跨平台系统时目标包括充分利用各个平台特性不仅考虑功能还要利用不同平台的性能优化和特性。关注编译器特性利用编译器提供的优化、警告、概念concepts等功能。最小化样板代码boilerplate避免重复写大量初始化、模板或辅助函数。减少冗余代码例如重复实现同一逻辑或类型特化。尽量不修改已有代码保证已有功能稳定减少回归风险。尽量减少预处理宏preprocessor macros宏容易引入不可控的副作用和调试困难应优先用模板、概念或constexpr替代。总结目标是写高效、可维护、可扩展的跨平台代码。2⃣ 设计方案The Design示例四元数类Quaternion族这是一个大型项目中的例子用于说明跨平台设计。项目构建问题不同平台可能需要包含不同的头文件。概念层次Concept Hierarchies使用 C20 概念concept来定义类型约束和接口契约。类和函数设计通过模板和泛型编程减少重复代码。提供统一接口屏蔽平台差异。核心思想在不同平台上复用核心逻辑同时对外提供统一接口。3⃣ 开放–封闭原则OCP: Open–Closed Principle定义对扩展开放对修改封闭。系统应允许通过添加新代码实现新功能而不是修改已有代码。在 C 中实现方式委托式多态delegated polymorphism使用虚函数、接口类、模板或概念将功能扩展委托给新类或函数而不修改原有类。好处避免“级联修改”cascade of changes。提高代码可维护性和稳定性。引用“Since programs that conform to the open–closed principle are changed by adding new code, rather than by changing existing code, they do not experience the cascade of changes exhibited by non-conforming programs.”— Robert C. Martin (1996)小结跨平台架构设计目标高性能、低冗余、低样板、易维护。设计方法使用模板、概念、抽象类和统一接口屏蔽平台差异。遵守 OCP通过扩展而不是修改已有代码实现新功能。利用多态、概念和模板实现委托式扩展。例子绘制图形 — C 风格未应用开放–封闭原则 OCP1⃣ 数据结构Shape Data在 C 语言中为了表示不同类型的形状通常会使用enum和structtypedefenum{circle,square}shape_type;shape_type枚举定义了形状类型圆形circle或正方形square。typedefstruct{shape_type type;intradius;}circle_shape;typedefstruct{shape_type type;intside_length;}square_shape;circle_shape结构体包含type形状类型必须是circleradius半径square_shape结构体包含type形状类型必须是squareside_length边长问题点每个形状都有自己的 struct需要手动管理。数据和行为绘制函数是分开的缺乏封装。2⃣ 绘图函数Drawing Functions针对每种形状单独实现绘制函数voiddraw_circle(circle_shape*c);voiddraw_square(square_shape*s);draw_circle专门绘制圆形draw_square专门绘制正方形这意味着每添加一种新形状都需要新增函数。3⃣ 绘制多个形状draw_shapes 函数voiddraw_shapes(shape**shapes,intn){inti;for(i0;in;i){switch(shapes[i]-type){casecircle:draw_circle((circle_shape*)(shapes[i]));break;casesquare:draw_square((square_shape*)(shapes[i]));break;}}}shapes是一个指向形状的指针数组。使用switch判断形状类型如果是circle调用draw_circle如果是square调用draw_square使用强制类型转换cast将shape*转为具体类型指针。4⃣ C 风格设计的问题点违反开放–封闭原则OCP如果要新增形状比如三角形必须修改draw_shapes函数违反“封闭修改”原则。类型安全问题使用void*或强制类型转换容易出错。编译器无法检查类型正确性。行为分离绘制逻辑在外部函数中而数据结构只包含数据缺乏封装。可维护性差每新增形状需要修改多个地方枚举、结构体、绘图函数、switch-case。总结这是典型的 C 风格实现以数据驱动类型判断enum switch来实现多态。问题在于扩展困难添加新形状需要修改已有函数类型不安全行为与数据分离在 C 中OCP 可以通过继承 虚函数或概念 模板来改进避免修改已有代码只通过扩展新类或新模板实现新的形状。例子绘制图形 — C 多态方式Polymorphic C Way1⃣ 形状类Shape Classes抽象基类shapeclassshape{public:virtualvoiddraw()const0;};shape是一个抽象基类abstract class。包含纯虚函数draw()表示所有形状都必须实现绘制方法。封装与多态数据和行为封装在类里。用户无需关心具体形状的实现。派生类circleclasscircle:publicshape{intradius;public:voiddraw()constoverride;};circle继承自shape包含私有数据成员radius重写draw()方法实现圆形绘制逻辑派生类squareclasssquare:publicshape{intside_length;public:voiddraw()constoverride;};square继承自shape包含私有数据成员side_length重写draw()方法实现正方形绘制逻辑2⃣ 绘制函数Draw Function#includeshape.hvoiddraw_shapes(std::vectorshape*shapes){for(autoconst*s:shapes){s-draw();}}shapes是一个指向shape*的向量核心点通过虚函数机制virtual function调用draw()方法实现运行时多态runtime polymorphism不需要switch-case或类型转换新增形状只需要新建派生类重写draw()方法不需要修改draw_shapes函数3⃣ 多态 C 风格的优点符合开放–封闭原则OCPdraw_shapes函数无需修改支持新形状扩展。类型安全无需强制类型转换编译器检查类型。封装数据和行为每个形状类封装自己的数据和绘制逻辑。易维护扩展新形状时只需增加新类不破坏已有代码。可复用性和可读性强用户只使用基类接口shape*无需了解具体实现。总结特性C 风格C 多态风格数据与行为分离封装在类里类型安全不安全需要 cast安全虚函数多态扩展性需修改 switch-case只需新增类遵守 OCP否是可维护性差好总结一句话C 多态方式通过继承与虚函数将“类型判断 绘制逻辑”隐藏在类内部实现了开放–封闭原则和更好的封装。1⃣ 原始开放–封闭原则Original OCP引用 Bertrand Meyer1988的定义模块应既“封闭”又“开放”封闭Closed一旦模块的服务对外公开客户端依赖这些服务进行开发时模块的现有功能不应受到新服务引入的影响。换句话说已有模块接口稳定现有客户代码不受影响。开放Open模块应能扩展新功能以支持未来的需求而无需修改已有代码。因为我们不可能一开始就实现所有客户端可能需要的功能。2⃣ OCP 在 C 中的体现在 C 中OCP 可以分为弱原则Weak OCP和强原则Strong OCP(1) 无 OCPNo OCP行为必须修改已有代码来添加新功能。客户端代码需要根据修改做出相应变化。问题现有模块不稳定维护成本高。修改模块会引发连锁修改。(2) 弱 OCPWeak OCP行为添加新功能时仍然需要修改已有代码但现有接口和行为保持不变。需要重新编译受影响的模块。特点接口稳定但实现需要改动。客户端依赖的接口不变但模块的代码仍需维护。(3) 强 OCPStrong OCP行为添加新功能完全无需修改已有代码。不影响现有模块的编译和客户端代码。实现方式通过多态polymorphism或委托delegation来扩展功能。保持模块接口和实现的独立性。优点最大化模块稳定性和可维护性。支持真正的“开闭”即模块对扩展开放对修改封闭。3⃣ 对比总结类型修改已有代码客户端影响编译影响无 OCP需要修改客户端需改动是弱 OCP需要修改客户端无需改动是强 OCP不修改客户端无需改动否关键点封闭Closed已有模块稳定客户端依赖的接口不变。开放Open模块可以扩展新功能不修改已有模块代码。C 实践强 OCP 通常通过虚函数、多态、接口抽象实现。弱 OCP 可能仍需修改实现但保证接口稳定。总结一句话OCP 的核心是“扩展无需修改”。强 OCP 通过抽象和多态实现弱 OCP则保证接口不变但实现可修改。1⃣ 架构设计指导原则Architecture Guidelines设计非常接近Bertrand Meyer的原始设想不局限于传统面向对象OOP数据与函数可以分离。添加新平台不应影响已实现的平台新增对某个平台的支持时已有平台代码无需修改。添加功能的版本或修订不应影响已实现的版本扩展功能版本时已有版本仍然保持稳定。2⃣ 平台Platform定义平台特定的功能集feature set每个平台包含实现同一功能但针对不同机器架构的实现。功能Feature抽象的功能单元需要根据目标机器架构实现不同版本。硬件相关CPU 架构x86, ARMSIMD 指令集SSE, SSE2, NeonDMA 控制器、GPIO 模块等软件相关操作系统Windows, Linux图形 APIDirectX, OpenGL注意功能不一定完全正交例如x86 SSEDirectX Windows功能之间可能存在耦合关系。3⃣ 目录和文件结构(1) Flat 结构平铺plt/simd Simd.h Neon32.h Sse.h Sse2.h ... plt/math Quat.h Quat_Common.h Quat_Neon32.h Quat_Sse.h Quat_Sse2.h ...所有文件平铺在同一目录下。易于查找但文件数量多时可能杂乱。(2) Deep 结构分层plt/simd Simd.h Neon32.h Sse.h Sse2.h ... plt/math Quat.h Common/ Quat_Common.h Vec_Common.h Mtx_Common.h ... Neon32/ Quat_Neon32.h Vec_Neon32.h Mtx_Neon32.h ...使用子目录按功能或平台分类。优点文件结构清晰便于管理平台相关实现。避免命名冲突。缺点包含路径较长需要宏或别名辅助引用。4⃣ 头文件包含策略每个功能Feature都有自己的头文件定义公共接口或宏。头文件负责包含平台特定的实现。使用预处理宏自动生成包含的文件名例如INCLUDE_SIMD(Quat)会展开为Quat_SSE2.h这样用户只需写INCLUDE_SIMD(Quat)无需关心平台实现。5⃣ 头文件包含宏示例#defineINCLUDE_PLT(Feature,File)INCLUDE_BUILD_FILENAME(Feature,File)#defineINCLUDE_PLT_FEATURE(Feature)INCLUDE_STRINGIZE(Feature.h)#defineINCLUDE_BUILD_FILENAME(Feature,File)INCLUDE_STRINGIZE(File##_##Feature.h)#defineINCLUDE_STRINGIZE(String)#String#defineINCLUDE_SIMD(File)INCLUDE_PLT(PLT_SIMD,File)INCLUDE_STRINGIZE(String)将宏参数转换为字符串。INCLUDE_BUILD_FILENAME(Feature, File)拼接文件名例如File_Feature.h。INCLUDE_PLT(Feature, File)生成平台相关的完整文件名。INCLUDE_SIMD(File)针对 SIMD 功能自动选择当前平台的 SIMD 文件。总结通过宏封装平台相关实现保持代码抽象。用户只需要关注功能接口如Quat无需关心平台差异。符合开放–封闭原则OCP添加新平台无需修改现有代码。1⃣ 创建功能Creating a Feature定义功能在构建系统build system中定义功能宏。创建头文件为每个功能创建一个公共头文件feature header。创建实现文件为每种特定平台或实现版本创建独立的头文件。目的是保持功能接口统一而实现可以随平台变化而变化。2⃣ SIMD 功能在构建系统中的配置在工具链文件中设置平台宏set(PLT_SIMD Common)在公共项目中将宏加入编译预处理定义add_compile_definitions( PLT_SIMD${PLT_SIMD} )这样在编译时代码可以根据PLT_SIMD的值自动选择平台特定实现。3⃣Simd.hSIMD 功能头文件#if!defined(PLT_SIMD)#errorYou must define PLT_SIMD.#endif#defineINCLUDE_SIMD(File)INCLUDE_PLT(PLT_SIMD,File)#includeINCLUDE_PLT_LOCAL(PLT_SIMD)功能说明检查是否定义PLT_SIMD如果没有定义则报错。定义宏INCLUDE_SIMD(File)用于包含平台特定实现。根据当前平台包含相应的 SIMD 文件。4⃣Simd_Common.h通用 SIMD 头文件namespaceplt::simd{structCommon{};}提供一个空的通用结构体用于标记或作为概念实现的基础。平台特定实现可继承或扩展此结构体。5⃣ 四元数的数学定义Quaternions, Mathematically Speaking四元数Quaternionq w x i y j z k q w x i y j z kqwxiyjzk基本单位i 2 j 2 k 2 i j k − 1 i^2 j^2 k^2 i j k -1i2j2k2ijk−1乘法规则i j k − j i , j k i − k j , k i j − i k i j k - j i, \quad j k i - k j, \quad k i j - i kijk−ji,jki−kj,kij−ik5.1 四元数的运算加法( a w a x i a y j a z k ) ( b w b x i b y j b z k ) ( a w b w ) ( a x b x ) i ( a y b y ) j ( a z b z ) k (a_w a_x i a_y j a_z k) (b_w b_x i b_y j b_z k) (a_w b_w) (a_x b_x)i (a_y b_y)j (a_z b_z)k(aw​ax​iay​jaz​k)(bw​bx​iby​jbz​k)(aw​bw​)(ax​bx​)i(ay​by​)j(az​bz​)k乘法( a w a x i a y j a z k ) ( b w b x i b y j b z k ) ( a w b w − a x b x − a y b y − a z b z ) ( a w b x a x b w a y b z − a z b y ) i ( a w b y − a x b z a y b w a z b x ) j ( a w b z a x b y − a y b x a z b w ) k \begin{aligned} (a_w a_x i a_y j a_z k)(b_w b_x i b_y j b_z k) (a_w b_w - a_x b_x - a_y b_y - a_z b_z) \ (a_w b_x a_x b_w a_y b_z - a_z b_y)i \ (a_w b_y - a_x b_z a_y b_w a_z b_x)j \ (a_w b_z a_x b_y - a_y b_x a_z b_w)k \end{aligned}(aw​ax​iay​jaz​k)(bw​bx​iby​jbz​k)​(aw​bw​−ax​bx​−ay​by​−az​bz​)​(aw​bx​ax​bw​ay​bz​−az​by​)i​(aw​by​−ax​bz​ay​bw​az​bx​)j​(aw​bz​ax​by​−ay​bx​az​bw​)k​共轭Conjugateq ∗ w − x i − y j − z k q^* w - x i - y j - z kq∗w−xi−yj−zk点积Dot Producta ⋅ b a w b w a x b x a y b y a z b z a \cdot b a_w b_w a_x b_x a_y b_y a_z b_za⋅baw​bw​ax​bx​ay​by​az​bz​模Norm∣ q ∣ q ⋅ q w 2 x 2 y 2 z 2 |q| \sqrt{q \cdot q} \sqrt{w^2 x^2 y^2 z^2}∣q∣q⋅q​w2x2y2z2​乘法逆元Multiplicative Inverseq − 1 q ∗ q ⋅ q q^{-1} \frac{q^*}{q \cdot q}q−1q⋅qq∗​除法a b a b − 1 a b ∗ b ⋅ b \frac{a}{b} a b^{-1} \frac{a b^*}{b \cdot b}ba​ab−1b⋅bab∗​6⃣ 四元数概念在 C20 中的映射数学定义四元数由数据与运算定义。C20 概念Concept定义四元数由数据成员定义运算可基于概念实现。实现策略通用实现依赖于概念定义。平台优化实现需符合概念并可替换通用实现。总结概念Concept定义了接口和数据结构约束。实现可以依赖概念进行优化和扩展保证 OCP开放–封闭原则。1⃣ Quaternion 概念C20 ConcepttemplatetypenameQconceptQuaternionrequires(Q q){typenameQ::Scalar;ArithmetictypenameQ::Scalar;{q.w()}-std::same_astypenameQ::Scalar;{q.x()}-std::same_astypenameQ::Scalar;{q.y()}-std::same_astypenameQ::Scalar;{q.z()}-std::same_astypenameQ::Scalar;};解析Q::Scalar表示四元数元素的标量类型例如float或double。Arithmetictypename Q::Scalar确保标量类型是算术类型。{ q.w() } - std::same_astypename Q::Scalar等语句要求Q提供访问四元数各分量的函数返回类型为标量类型。对应数学上的四元数q w x i y j z k q w x i y j z kqwxiyjzk其中w , x , y , z w, x, y, zw,x,y,z对应q.w(), q.x(), q.y(), q.z()。2⃣ 支持性概念Supporting ConceptsArithmetictemplatetypenameTconceptArithmeticstd::is_arithmetic_vT;限定标量类型必须是算术类型整数或浮点数。MutuallyArithmetictemplatetypenameT,typenameUconceptMutuallyArithmeticrequires(T t,U u){requiresArithmeticT;requiresArithmeticU;{tu};{t-u};{t*u};{t/u};};限定两个类型间可以进行算术运算。用于实现四元数间或四元数与标量间的运算。3⃣ 标准四元数类型声明Standard Quaternion TypetemplatetypenameS,typenameIplt::simd::PLT_SIMDclassQuat{public:usingScalarS;private:Scalar w_,x_,y_,z_;// ... 构造函数// ... 访问器};S标量类型例如float、double。ISIMD 平台选择可用于优化实现。私有成员w_, x_, y_, z_存储四元数分量。4⃣ 构造函数ConstructorsQuat()default;Quat(Scalar w,Scalar x,Scalar y,Scalar z)noexcept(...):w_(w),x_(x),y_(y),z_(z){}Quat(Scalarw,Scalarx,Scalary,Scalarz)noexcept(...):w_(std::move(w)),x_(std::move(x)),y_(std::move(y)),z_(std::move(z)){}templateQuaternion Qrequiresstd::convertible_totypenameQ::Scalar,ScalarQuat(constQrhs)noexcept(...):Quat(Scalar{rhs.w()},Scalar{rhs.x()},Scalar{rhs.y()},Scalar{rhs.z()}){}支持拷贝构造、移动构造、以及从其他符合Quaternion概念的四元数构造。保证了类型安全与异常安全noexcept。5⃣ 赋值操作符Assignment OperatortemplateQuaternion Qrequiresstd::convertible_totypenameQ::Scalar,ScalarQuatoperator(constQrhs)noexcept(...){w_Scalar{rhs.w()};x_Scalar{rhs.x()};y_Scalar{rhs.y()};z_Scalar{rhs.z()};return*this;}支持从任意满足Quaternion概念的四元数赋值。自动转换标量类型保证类型安全。6⃣ 访问器AccessorsconstScalarw()constnoexcept{returnw_;}constScalarx()constnoexcept{returnx_;}constScalary()constnoexcept{returny_;}constScalarz()constnoexcept{returnz_;}提供对四元数各分量的只读访问。与数学表示一一对应q w x i y j z k q w x i y j z kqwxiyjzk7⃣ 泛型操作实现General Operation Implementation使用表达式树expression trees来实现操作。可在任何平台上运行。支持任何算术标量类型。参数类型通过C20 Concepts限定保证接口一致性。总结C20 的概念使四元数实现可泛化、类型安全且可优化。数学上的四元数运算与 C 概念紧密对应。可根据 SIMD 或其他平台进行优化实现而无需修改接口符合OCP开放–封闭原则。1⃣ 什么是表达式树Expression Tree表达式树是一种延迟求值lazy evaluation的表示方法将表达式拆分为节点每个节点表示运算或操作数。示例表达式q 1 q 2 ∗ q 3 q_1 q_2 * q_3q1​q2​∗q3​对应的表达式树如下QuaternionAddition / \ q1 QuaternionMultiplication / \ q2 q3每个运算符如、*在树中生成一个节点操作数为叶子节点。2⃣ C 实现运算符和表达式节点2.1 加法运算符Operator OverloadtemplateQuaternion QL,Quaternion QRinlineautooperator(constQLlhs,constQRrhs)noexcept-QuaternionAdditionQL,QR{returnQuaternionAddition(lhs,rhs);}该运算符返回一个表达式节点QuaternionAddition。实际的加法操作不会立即执行而是构建表达式树。2.2 四元数二元表达式基类templateQuaternion QL,Quaternion QRrequiresMutuallyArithmetictypenameQL::Scalar,typenameQR::ScalarclassQuaternionBinaryExpr:publicQuaternionExpr{usingSLtypenameQL::Scalar;usingSRtypenameQR::Scalar;public:usingScalartypenamestd::common_typeSL,SR::type;};通过MutuallyArithmetic确保两边标量类型可以算术运算。使用std::common_type推导结果标量类型保证兼容不同标量类型。2.3 加法表达式节点templateQuaternion QL,Quaternion QRclassQuaternionAddition:publicQuaternionBinaryExprQL,QR{QL l_;QR r_;public:usingScalartypenameQuaternionBinaryExprQL,QR::Scalar;QuaternionAddition(constQLlhs,constQRrhs)noexcept:l_(lhs),r_(rhs){}Scalarw()constnoexcept{returnl_.w()r_.w();}Scalarx()constnoexcept{returnl_.x()r_.x();}Scalary()constnoexcept{returnl_.y()r_.y();}Scalarz()constnoexcept{returnl_.z()r_.z();}};保存左右子表达式。访问函数w(), x(), y(), z()在访问时计算对应分量的加法。延迟求值保证了表达式树可以组合复杂运算。3⃣ 标量函数示例templateQuaternion QL,Quaternion QRinlineautoDot(constQLlhs,constQRrhs)noexcept-QuaternionBinaryTypeQL,QR{returnlhs.w()*rhs.w()lhs.x()*rhs.x()lhs.y()*rhs.y()lhs.z()*rhs.z();}计算两个四元数的点积a ⋅ b a w b w a x b x a y b y a z b z a \cdot b a_w b_w a_x b_x a_y b_y a_z b_za⋅baw​bw​ax​bx​ay​by​az​bz​返回标量类型依赖于QuaternionBinaryType的推导。4⃣ 通用实现Common ImplementationQuatfloateval(Quatfloata,Quatfloatb,Quatfloatc){return(a*bc)/(a-c);}所有四元数表达式基于概念Concepts和通用类实现。可在任意平台上运行只要标量类型在该平台上支持。编译器会根据表达式树进行优化。优点跨平台统一实现。无需手动展开所有组合运算。可依赖编译器进行自动优化。5⃣ 针对 ARM Neon 优化5.1 构建系统更新修改 SIMD 宏set(PLT_SIMD Neon32)可能需要设置编译器标志以启用 Neon。5.2 Neon32 特性头文件namespaceplt::simd{structNeon32:Common{};templatetypenameSIMDconceptNeon32Familystd::derived_fromSIMD,Neon32;}提供平台标识和概念约束。5.3 四元数类针对 Neon32templateclassQuatfloat,plt::simd::Neon32{float32x4_t value_;// Neon 寄存器public:usingScalarfloat;Quat()default;Quat(Scalar w,Scalar x,Scalar y,Scalar z){floatvals[]{w,x,y,z};value_vld1q_f32(vals);// 加载到 Neon 寄存器}Scalarw()constnoexcept{returnvgetq_lane_f32(value_,0);}Scalarx()constnoexcept{returnvgetq_lane_f32(value_,1);}Scalary()constnoexcept{returnvgetq_lane_f32(value_,2);}Scalarz()constnoexcept{returnvgetq_lane_f32(value_,3);}};使用 Neon SIMD 寄存器存储四元数。构造函数和访问器直接操作 SIMD 寄存器。所有运算仍可使用通用实现只是数据存储和加载更快。6⃣ 当前状态总结通用表达式树实现已经完成。四元数可在 Neon 寄存器中进行存储和运算。通用算法无需修改即可获得平台优化的性能。可在不同平台使用不同 SIMD 优化实现而不改变接口实现开放–封闭原则OCP。1⃣ 平台特化ARM Neon32 四元数函数templateplt::simd::Neon32Family SIMDinlineautooperator-(Quatfloat,SIMDq)-Quatfloat,SIMD{float32x4_t valueq.NeonVal();float32x4_t negation(-q).NeonVal();float32x4_t resultvcopyq_laneq_f32(negation,0,value,0);returnQuatfloat,SIMD(result);}针对 Neon32 平台的四元数取负操作。使用 Neon SIMD 寄存器float32x4_t将四个浮点数打包到单个寄存器。延迟求值仍然生效表达式树可以使用这个特化类型执行运算。vcopyq_laneq_f32是 Neon 特定的向量操作将特定元素复制或重新排列。1.1 平台特化使用示例Quatfloateval(Quatfloata,Quatfloatb,Quatfloatc){return(a*bc)/(a-c);}对于 Neon32 特化a, b, c的数据会在 Neon 寄存器中进行运算。通用表达式树和算法无需修改依然适用。2⃣ SSE 平台特化2.1 构建系统更新创建新的工具链文件并设置set(PLT_SIMD SSE)SSE 平台使用 128-bit 寄存器可同时存放 4 个浮点数float不支持 2 个 double 同时存储。2.2 SSE 特性头文件namespaceplt::simd{structSse:Common{};templatetypenameSIMDconceptSseFamilystd::derived_fromSIMD,Sse;}用于标识 SSE 平台方便模板约束。2.3 四元数 SSE 特化类templateclassQuatfloat,plt::simd::Sse{__m128 value_;public:usingScalarfloat;Quat(Scalar w,Scalar x,Scalar y,Scalar z){value__mm_setr_ps(w,x,y,z);// 加载到 SSE 寄存器}Scalarw()constnoexcept{return_mm_cvtss_f32(SseVal());}Scalarx()constnoexcept{return_mm_cvtss_f32(_mm_shuffle_ps(SseVal(),SseVal(),_MM_SHUFFLE(1,1,1,1)));}Scalary()constnoexcept{return_mm_cvtss_f32(_mm_shuffle_ps(SseVal(),SseVal(),_MM_SHUFFLE(2,2,2,2)));}Scalarz()constnoexcept{return_mm_cvtss_f32(_mm_shuffle_ps(SseVal(),SseVal(),_MM_SHUFFLE(3,3,3,3)));}__m128SseVal()constnoexcept{returnvalue_;}};__m128表示 SSE 寄存器存储四个 float。使用_mm_setr_ps加载四个浮点数。通过_mm_shuffle_ps提取寄存器中对应的分量。访问器保证对 SSE 寄存器的安全读取。2.4 SSE 平台的标量运算点积templateplt::simd::Sse SIMDinlineautoDot(Quatfloat,SIMDlhs,Quatfloat,SIMDrhs)-float{__m128 squares_mm_mul_ps(lhs.SseVal(),rhs.SseVal());// 分量乘法__m128 badc_mm_shuffle_ps(squares,squares,_MM_SHUFFLE(2,3,0,1));// 调整顺序__m128 pairs_mm_add_ps(squares,badc);// 前两两相加__m128 bbaa_mm_shuffle_ps(pairs,pairs,_MM_SHUFFLE(0,1,2,3));__m128 dp_mm_add_ps(pairs,bbaa);// 汇总到单一向量floatresult_mm_cvtss_f32(dp);// 提取结果returnresult;}SSE 内置函数实现 4 分量的快速点积。所有运算在寄存器中完成避免数据搬运到通用寄存器。3⃣ 多平台支持与独立优化现在支持两种平台Neon32 和 SSE。优化是完全独立的Neon32 使用 ARM SIMD 寄存器。SSE 使用 x86 SSE 寄存器。没有使用任何#if或#ifdef条件编译。每个平台只包含该平台特定的头文件和内建函数。通用表达式树算法无需修改即可使用平台优化实现。4⃣ 处理特性修订Feature RevisionsSSE2 支持 128-bit 寄存器同时可存储 2 个 double。对 SSE2 平台可新增以下类型Quatfloat, Sse2Quatdouble, Sse2特化步骤与 SSE 相似模板类和函数可复用只需修改类型和寄存器指令。5⃣ 总结四元数类实现遵循 OCP 原则添加新平台Neon32、SSE、SSE2无需修改已有平台代码。现有算法和表达式树通用实现不受影响。平台特化与通用实现解耦通用实现负责算法逻辑。平台特化负责寄存器布局和 SIMD 优化。跨平台架构的关键点模板 概念Concepts定义接口。特化类实现平台特定优化。延迟求值Expression Tree保证组合性和性能。1⃣ SSE2 特性与类实现1.1 SSE2 平台头文件#defineSIMD_HAS_SSE2#includeSse.hnamespaceplt::simd{structSse2:Sse{};templatetypenameSIMDconceptSse2FamilySseFamilySIMDstd::derived_fromSIMD,Sse2;}SSE2 继承自 SSEstruct Sse2 : Sse {}。Sse2Family概念约束模板参数确保其为 SSE 家族成员且派生自 Sse2。模板约束保证了重载解析优先选择更特化的平台实现。1.2 Quatfloat, Sse2 特化templateclassQuatfloat,plt::simd::Sse2:publicQuatfloat,plt::simd::Sse{usingQuatfloat,plt::simd::Sse::Quat;};直接继承 SSE 特化实现复用。构造函数、访问器等直接从 SSE 特化继承。1.3 Quatdouble, Sse2 特化templateclassQuatdouble,plt::simd::Sse2{__m128d wx_;// w, x__m128d yz_;// y, zpublic:usingScalardouble;Quat()default;Quat(Scalar w,Scalar x,Scalar y,Scalar z){wx__mm_set_pd(x,w);yz__mm_set_pd(z,y);}templateQuaternion QQuat(constQrhs):Quat(static_castScalar(rhs.w()),static_castScalar(rhs.x()),static_castScalar(rhs.y()),static_castScalar(rhs.z())){}Quat(__m128d wx,__m128d yz):wx_(wx),yz_(yz){}Scalarw()const{return_mm_cvtsd_f64(SseWx());}Scalarx()const{return_mm_cvtsd_f64(_mm_unpackhi_pd(SseWx(),SseWx()));}Scalary()const{return_mm_cvtsd_f64(SseYz());}Scalarz()const{return_mm_cvtsd_f64(_mm_unpackhi_pd(SseYz(),SseYz()));}__m128dSseWx()const{returnwx_;}__m128dSseYz()const{returnyz_;}};利用 SSE2 128-bit 寄存器存储 double 类型的 w,x 和 y,z。_mm_set_pd设置寄存器值。_mm_unpackhi_pd提取寄存器高位 double 值。1.4 SSE2 平台点积函数templateplt::simd::Sse2 SIMDinlineautoDot(Quatdouble,SIMDlhs,Quatdouble,SIMDrhs)-double{__m128d w2x2_mm_mul_pd(lhs.SseWx(),rhs.SseWx());__m128d x2w2_mm_shuffle_pd(w2x2,w2x2,_MM_SHUFFLE2(0,1));__m128d wx2wx2_mm_add_pd(w2x2,x2w2);__m128d y2z2_mm_mul_pd(lhs.SseYz(),rhs.SseYz());__m128d z2y2_mm_shuffle_pd(y2z2,y2z2,_MM_SHUFFLE2(0,1));__m128d yz2yz2_mm_add_pd(y2z2,z2y2);__m128d dp_mm_add_pd(wx2wx2,yz2yz2);doubleresult_mm_cvtsd_f64(dp);returnresult;}SSE2 支持 double 的并行运算。点积通过寄存器操作_mm_mul_pd,_mm_shuffle_pd,_mm_add_pd高效计算。2⃣ SSE3 平台扩展SSE3 继承 SSE2不需要新寄存器。float 和 double 特化类可复用 SSE2 特化。利用_mm_hadd_ps和_mm_hadd_pd实现更高效水平加法。2.1 float 点积 SSE3templateplt::simd::Sse3 SIMDinlineautoDot(Quatfloat,SIMDlhs,Quatfloat,SIMDrhs)-float{__m128 squares_mm_mul_ps(lhs.SseVal(),rhs.SseVal());// 分量乘法__m128 add1st_mm_hadd_ps(squares,squares);// 两两相加__m128 add2nd_mm_hadd_ps(add1st,add1st);// 全部求和floatresult_mm_cvtss_f32(add2nd);returnresult;}2.2 double 点积 SSE3templateplt::simd::Sse3 SIMDinlineautoDot(Quatdouble,SIMDlhs,Quatdouble,SIMDrhs)-double{__m128d w2x2_mm_mul_pd(lhs.SseWx(),rhs.SseWx());__m128d y2z2_mm_mul_pd(lhs.SseYz(),rhs.SseYz());__m128d add1_mm_hadd_pd(w2x2,y2z2);__m128d add2_mm_hadd_pd(add1,add1);doubleresult_mm_cvtsd_f64(add2);returnresult;}_mm_hadd_ps和_mm_hadd_pd是 SSE3 新增指令实现水平加法优化。3⃣ 函数重载解析与概念Concepts3.1 重载解析Overload Resolution编译器根据函数候选列表选择最佳匹配。若无最佳匹配报错为“ambiguous overload”。3.2 概念在重载解析中的作用概念不仅约束模板参数有效性类似enable_if还参与最佳匹配的选择。对于类模板派生类的模板优先于基类模板。概念组合概念可以在定义中组合其他概念。概念本身不能继承但可通过“subsumption”确定优先级。Subsumption一个概念比另一个概念更“特化”在重载解析中优先选择。4⃣ 总结SSE2 与 SSE3 特化继承关系SSE2 继承 SSESSE3 继承 SSE2。更特化的平台优先匹配保证性能优化生效。浮点类型与寄存器布局float:__m128double:__m128d分成 wx_ 和 yz_ 两个寄存器存储。通用算法与平台特化解耦表达式树和通用算法无需修改即可支持新平台。平台优化通过模板特化实现。C20 Concepts 与重载解析概念用于模板约束。更特化的概念或派生类优先匹配保证正确调用平台特化实现。1⃣ Subsumption概念覆盖在代码中的作用1.1 概念定义与覆盖关系structSse:Common{};structSse2:Sse{};templatetypenameSIMDconceptSseFamilystd::derived_fromSIMD,Sse;templatetypenameSIMDconceptSse2FamilySseFamilySIMDstd::derived_fromSIMD,Sse2;templatetypenameSIMDconceptSse2Derivedstd::derived_fromSIMD,Sse2;Sse2Family是 SseFamily 的子集当Sse2FamilyDerived为 true 时SseFamilyDerived也为 true。但 Sse2Derived 并不覆盖 SseFamily因此不能参与重载优先匹配。概念覆盖subsumption的作用概念 A 覆盖概念 B → 对 A 的约束更特化优先匹配。这是 C20 模板重载选择的关键机制。1.2 没有概念覆盖的函数重载问题templatetypenameSIMDconceptSse3Familystd::derived_fromSIMD,Sse3;templateplt::simd::SseFamily SIMDinlineautooperator*(Quatfloat,SIMDlhs,Quatfloat,SIMDrhs)-Quatfloat,SIMD;templateplt::simd::Sse3Family SIMDinlineautooperator*(Quatfloat,SIMDlhs,Quatfloat,SIMDrhs)-Quatfloat,SIMD;问题Sse3Family 仅是一个单独标签概念没有与 Sse2Family 或 SseFamily 的覆盖关系。结果operator*调用会产生ambiguous overload重载二义性错误。原因Sse3Family 的参数类型严格是 Sse3SseFamily 可接受更多类型但两者没有覆盖关系编译器无法确定哪一个函数优先。1.3 有概念覆盖的正确实现templatetypenameSIMDconceptSse2FamilySseFamilySIMDstd::derived_fromSIMD,Sse2;templatetypenameSIMDconceptSse3FamilySse2FamilySIMDstd::derived_fromSIMD,Sse3;特点Sse2Family 覆盖 SseFamilySse3Family 覆盖 Sse2Family覆盖关系是可传递的transitive效果编译器会优先选择最特化的概念对应的函数Sse3Family。避免了重载二义性。2⃣ 平台特化与继承策略2.1 SSE / SSE2 / SSE3数据类和函数在 SSE 上实现。SSE2 继承 SSE 优化函数无需额外代码。SSE3 仅实现少量更优化函数其余继承 SSE2。结果新版本函数不会影响旧平台。保持 OCP开放-关闭原则强约束无需修改旧代码也不需要重新编译旧平台。2.2 AVX 平台AVX 引入 256-bit 寄存器Quat 无法直接使用宽寄存器仍继承前代实现。Quat 可以完整放入单寄存器需新数据类型。问题Quatdouble, Avx 若与 SSE4 共用 math 头文件会出现寄存器不兼容错误。初始头文件拆分Quat.h, Quat_Sse.h还不够需要进一步分离函数实现。2.3 分离头文件策略类定义与函数实现分离Quat.h / Quat_Sse.h / Quat_Avx.h → 数据类QuatMath.h / QuatMath_Sse.h / QuatMath_Avx.h → 函数实现AVX 示例QuatFloatMath_Avx.h包含QuatFloatMath_Sse4.h继承 float 操作QuatDoubleMath_Avx.h不包含旧头文件避免 double 操作不兼容好处避免不同平台 math 实现冲突保持旧平台编译结果不变 → 近乎“强 OCP”3⃣ 总结要点概念覆盖SubsumptionSse3Family → Sse2Family → SseFamily确保模板重载正确选择最特化版本。平台隔离每个平台的数据类型与函数实现独立。新平台不会影响旧平台构建。函数复用SSE / SSE2 / SSE3 / AVX 复用已有优化函数减少冗余。OCP 实现新特性添加不修改旧代码。分离数据类和函数实现保证不同平台独立优化。C20 Concepts 的优势提供了类型约束和重载优先级控制。通过 subsumption 和派生关系可实现跨平台 SIMD 重载无二义性。代码太多看不懂https://github.com/noahstein/Ark
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做网站需要知道什么软件鸣蝉建站平台

Facebook iOS SDK 终极指南:10个核心功能与实战应用全解析 【免费下载链接】facebook-ios-sdk facebook/facebook-ios-sdk: Facebook iOS SDK 是一套官方提供的 iOS 平台开发工具包,允许开发者将 Facebook 登录、分享、广告等功能集成到自己的 iOS 应用程…

张小明 2025/12/23 6:59:57 网站建设

做网站建设最好的公司是牙科医院网站设计怎么做

第一章:量子电路可视化的缩放功能概述在量子计算领域,随着量子电路规模的不断增长,可视化复杂度也随之上升。有效的缩放功能成为理解和分析大型量子电路的关键工具。通过动态调整视图比例,用户可以在保持整体结构清晰的同时&#…

张小明 2026/1/1 14:06:28 网站建设

餐饮vi设计一套多少钱游戏优化大师官方下载

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 快速开发一个基于交叉熵的文本分类原型。要求:1. 使用预训练BERT模型 2. 处理中文或英文文本数据 3. 实现数据预处理和tokenization 4. 使用交叉熵损失函数 5. 包含模型…

张小明 2025/12/23 6:57:51 网站建设

网站开发团队工作总结做普通网站选择什么服务器

数字支付与资源管理的前沿探索 在当今数字化的时代,密码学难题、支付方案以及资源管理等问题成为了保障系统安全和高效运行的关键因素。下面将深入探讨时间锁谜题、各类支付方案以及它们在资源管理中的应用。 时间锁谜题 时间锁谜题,如 LCS35 时间胶囊,是由 Ron Rivest、…

张小明 2026/1/1 16:04:37 网站建设

网页设计公司建设网站深圳人口1756万

数据库系统原理深度解析:王能斌PDF电子书完全指南 【免费下载链接】数据库系统原理王能斌PDF版本介绍 《数据库系统原理》是王能斌编著的经典教材,全面系统地介绍了数据库系统的基本原理、技术与应用。本书内容涵盖数据库基本概念、关系模型、SQL语言、数…

张小明 2025/12/23 6:55:45 网站建设

php网站制作工具建设银行深圳天健世纪支行网站

Windows 文件、磁盘和文件服务器管理脚本详解 1. 创建新的计划任务脚本 在 Windows 环境中,可使用 Windows Management Instrumentation (WMI) 查询来创建新的计划任务。以下是实现该功能的脚本代码: Dim sCmd, oWMI, oJob, errResult, iJob If WScript.Arguments.Named…

张小明 2025/12/23 6:54:42 网站建设