当前位置: 首页 > news >正文

高性能面试八股文之编译流程程序调度

1. C的编译流程

C语言程序的编译过程通常包括预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)四个主要阶段。下面是这些阶段的详细说明:

1.预处理(Preprocessing):

  • 目的:在编译前进行一些预处理操作,如宏替换、文件包含等,生成一个扩展名为.i的中间文件。
  • 命令:gcc -E source.c -o output.i
  • #include <stdio.h>#define PI 3.14159int main() {printf("The value of PI is: %f\n", PI);return 0;
    }
    

    经过预处理后的代码可能包含#include指令中的文件内容,以及宏替换后的内容。

2.编译(Compilation):

    • 目的:将预处理后的文件进行编译,生成一个汇编语言代码文件,扩展名为.s
    • 命令:gcc -S output.i -o output.s
    • 示例:
    • .section    __TEXT,__text,regular,pure_instructions
      .globl    _main
      .align    4, 0x90
      _main:                                  ## @main.cfi_startproc
      ## BB#0:pushq    %rbp.cfi_def_cfa_offset 16.cfi_offset %rbp, -16movq    %rsp, %rbp.cfi_def_cfa_register %rbpsubq    $16, %rspleaq    L_.str(%rip), %rdimovabsq    $4614256656552045848, %rax # imm = 0x3FF921FB54442D18movq    %rax, -8(%rbp)movb    $0, %alcallq    _printfxorl    %eax, %eaxaddq    $16, %rsppopq    %rbpretq.cfi_endproc
      L_.str:                                  ## @.str.asciz    "The value of PI is: %f\n".subsections_via_symbols
      

      • 这是一个汇编语言的代码文件,展示了C代码的汇编翻译。

3.汇编(Assembly):

  • 目的:将汇编语言代码转换成机器码,生成一个目标文件,扩展名为.o
  • 命令:gcc -c output.s -o output.o
  • 示例:生成一个目标文件,包含机器可执行代码。
    • 这是一个简化的编译过程,实际上可能涉及到更多的细节和选项。编译器(如gcc)通常会在后台处理这些步骤,使得编译过程对用户来说更加方便。

4.链接(Linking):

  • 目的:将程序中使用的函数和库连接在一起,生成最终的可执行文件。
  • 命令:gcc output.o -o executable
  • 示例:将目标文件与系统库进行链接,生成可执行文件。

2. C++的编译流程

C++的编译流程与C语言的编译流程基本相似,因为C++是在C的基础上发展而来的,但C++引入了面向对象的特性,因此在编译过程中可能会包括更多的步骤。下面是C++程序的典型编译流程:

1.预处理(Preprocessing):

  • 目的:执行预处理,包括宏替换、文件包含等,生成一个扩展名为.ii的中间文件。
  • 命令:g++ -E source.cpp -o output.ii
  • 示例:
    #include <iostream>#define PI 3.14159int main() {std::cout << "The value of PI is: " << PI << std::endl;return 0;
    }
    

  • 经过预处理后的代码可能包含#include指令中的文件内容,以及宏替换后的内容。

2.编译(Compilation):

  • 目的:将预处理后的文件进行编译,生成一个汇编语言代码文件,扩展名为.s
  • 命令:g++ -S output.ii -o output.s

示例:

.section    __TEXT,__text,regular,pure_instructions
.globl    _main
.align    4, 0x90
_main:                                  ## @main.cfi_startproc
## BB#0:pushq    %rbp.cfi_def_cfa_offset 16.cfi_offset %rbp, -16movq    %rsp, %rbp.cfi_def_cfa_register %rbpleaq    L_.str(%rip), %rdimovabsq    $4614256656552045848, %rax # imm = 0x3FF921FB54442D18movq    %rax, -8(%rbp)movb    $0, %alcallq    __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKcmovabsq    $4614256656552045848, %rcx # imm = 0x3FF921FB54442D18movq    %rcx, -16(%rbp)movq    %rax, %rdicallq    __ZNSolsEdleaq    L_.str.1(%rip), %rdimovq    %rax, -24(%rbp)movq    %rax, %rsimovq    %rdi, %raxmovq    %rax, %rdicallq    __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKcmovq    -16(%rbp), %rsimovabsq    $4614256656552045848, %rcx # imm = 0x3FF921FB54442D18movq    %rcx, %rdimovq    %rax, %rdxcallq    __ZNSolsEdleaq    L_.str.2(%rip), %rdimovq    %rax, %rsicallq    __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKcmovq    %rax, %rsimovq    -24(%rbp), %rdicallq    __ZNSolsEPFRSoS_Emovl    $0, %eaxaddq    $8, %rsppopq    %rbpretq.cfi_endproc.section    __TEXT,__cstring,cstring_literals
L_.str:                                  ## @.str.asciz    "The value of PI is: %f\n".section    __TEXT,__cstring,cstring_literals
L_.str.1:                                ## @.str.1.asciz    "%f".section    __TEXT,__cstring,cstring_literals
L_.str.2:                                ## @.str.2.asciz    "\n".subsections_via_symbols

这是一个汇编语言的代码文件,展示了C++代码的汇编翻译。

3.汇编(Assembly):

  • 目的:将汇编语言代码转换成机器码,生成一个目标文件,扩展名为.o
  • 命令:g++ -c output.s -o output.o
  • 示例:生成一个目标文件,包含机器可执行代码。

4.链接(Linking):

  • 目的:将程序中使用的函数和库连接在一起,生成最终的可执行文件。
  • 命令:g++ output.o -o executable
  • 示例:将目标文件与系统库进行链接,生成可执行文件。

这个流程大致描述了C++程序的编译过程。实际上,C++编译器(如g++)可能会在后台执行更多的优化和处理步骤。

3. cuda程序的编译流程

CUDA(Compute Unified Device Architecture)是一种由NVIDIA提供的并行计算平台和编程模型,用于利用NVIDIA GPU的计算能力。CUDA程序的编译过程涉及到主机端(Host)和设备端(Device)两个部分。

以下是简化的CUDA程序编译流程:

  1. CUDA源代码:

    • 主机端代码(运行在CPU上)和设备端代码(运行在GPU上)都包含在CUDA源代码中,通常具有.cu.cuh的文件扩展名。
  2. 主机端编译:

    • 使用主机端编译器(如nvcc)对CUDA源代码进行编译。nvcc会将主机端代码编译成可执行文件,同时将设备端代码提取出来。
    • 命令:nvcc -o executable host_code.cu
  3. 设备端编译:

    • 使用设备端编译器(PTX(Parallel Thread Execution)编译器)将设备端代码编译成PTX汇编代码。PTX是一种中间表示,可以在不同的GPU上运行。
    • 命令:生成的PTX文件通常以.ptx为扩展名。
  4. 设备端汇编:

    • 使用设备端汇编器将PTX汇编代码转换为针对特定GPU架构的二进制代码(CUBIN文件)。
    • 命令:生成的CUBIN文件通常以.cubin为扩展名。
  5. 链接:

    • 使用链接器将主机端可执行文件与设备端CUBIN文件进行链接,生成最终的可执行文件。
    • 命令:通常不需要手动执行链接步骤,nvcc会自动完成。

总体来说,nvcc编译器会负责协调这些步骤,将主机端和设备端的代码整合在一起,生成可在GPU上执行的最终可执行文件。这个文件可以在CPU上运行主机端代码,并在GPU上运行设备端代码,实现协同计算。需要注意的是,CUDA编程通常需要考虑设备内存管理、线程调度等与GPU相关的特性。

4. cuda SM的调度逻辑以及如何进行调度优化

CUDA中的SM(Streaming Multiprocessor)是NVIDIA GPU中的一个核心执行单元,负责执行CUDA线程块(Thread Blocks)中的线程。SM的调度逻辑涉及到线程调度和指令调度两个方面。

线程调度:

  1. Warp:

    • SM中的线程以Warp为单位进行调度。Warp是包含32个线程的基本调度单元。
    • 同一Warp中的线程同时执行相同的指令,称为SIMD(Single Instruction, Multiple Data)执行模型。
  2. 调度单元:

    • SM包含多个调度单元(Scheduler),每个调度单元负责调度一个Warp的执行。
    • 当一个Warp中的某个线程暂停(如等待数据或分支等待)时,调度单元可以调度其他活跃的Warp。
  3. 上下文切换:

    • 当一个Warp中的线程在执行过程中发生分支等待或者数据相关的暂停时,调度单元会切换到另一个Warp,以保持GPU的执行单元忙碌。

指令调度:

  1. 指令发射:

    • 每个调度单元负责将Warp中的指令发射到执行单元。发射的指令会进入指令缓存。
  2. 执行单元:

    • SM包含多个执行单元,每个执行单元可以执行特定类型的指令(整数、浮点数、特殊操作等)。
    • 每个Warp中的指令通过执行单元并行执行,以提高整体吞吐量。

调度优化:

  1. Warp Divergence:

    • 尽量避免Warp中的线程分支等待导致的Warp Divergence,即不同线程执行不同的分支。
    • 同一Warp中的线程应尽量执行相同的代码路径,以最大程度地利用SIMD执行模型。
  2. 隐藏内存访问延迟:

    • 通过使用共享内存、使用纹理缓存等手段,尽量隐藏对全局内存的访问延迟,以充分利用SM中的调度资源。
  3. 减小资源竞争:

    • 避免过多的资源竞争,例如使用原子操作时可能导致的竞争问题,以减小SM中调度单元的负担。
  4. 最大化吞吐量:

    • 在设计CUDA内核时,应考虑尽量提高Warp的吞吐量,使得SM能够同时执行多个Warp以充分发挥并行计算能力。
  5. 使用适当的数据类型:

    • 选择适当的数据类型可以提高内存带宽利用率,从而优化调度效率。

调度优化是一个复杂的任务,需要深入理解GPU架构、CUDA编程模型和具体应用的特点。通过合理设计CUDA内核,可以最大程度地发挥GPU的性能。可以使用CUDA的性能分析工具,如NVIDIA Visual Profiler(nvvp)等,来进行调度效率的评估和优化。

5. 多stream程序调度优化

在CUDA编程中,使用多个流(streams)可以提高并行性,充分利用GPU资源。流是一组按照顺序执行的CUDA操作,而多个流可以在同一设备上并发执行。以下是一些多流程序调度的优化策略:

  1. 流的创建和销毁:

    • 尽可能在程序的生命周期中创建一次流并多次重复使用,而不是频繁地创建和销毁流。
    • 流的创建和销毁本身会涉及一些开销,因此最好在初始化阶段创建所需的流,并在整个应用程序的执行过程中重复使用它们。
  2. 异步执行:

    • 在程序中使用异步执行,即在主机端和设备端之间异步启动和等待流。
    • 通过异步执行,可以在主机端执行计算或数据传输的同时,让设备端执行其他任务,提高整体性能。
  3. 流之间的任务划分:

    • 将任务划分到不同的流中,确保在同一流上的任务之间有一定的并行性。
    • 如果任务之间存在依赖关系,确保这些依赖关系不会导致流之间的同步,以最大程度地发挥流并发性。
  4. 数据传输优化:

    • 在使用多流时,考虑数据传输的优化。可以使用异步传输、使用页锁内存(pinned memory)以及使用DMA引擎等技术来最小化主机与设备之间的数据传输时间。
  5. 流同步:

    • 在需要等待某个流上的任务完成时使用显式同步。可以使用cudaStreamSynchronize函数等待流上的任务完成。
    • 注意,不同流之间的同步会导致性能损失,因此只在必要时使用同步。
  6. 流的数量:

    • 流的数量不是越多越好,过多的流可能导致资源竞争和调度开销。
    • 在选择流的数量时,可以进行一些实验和性能分析,以找到最佳的流的数量,以平衡并行性和调度开销。
  7. 使用CUDA事件:

    • 使用CUDA事件(cudaEvent_t)可以更细粒度地控制流之间的同步和异步操作。
    • 通过记录事件,可以在流之间建立更复杂的依赖关系,提高并行性。
  8. 动态并行性调整:

    • 根据硬件配置和程序特点,动态调整并行性。有些情况下,调整并行任务的数量和大小可以获得更好的性能。

通过合理利用这些优化策略,可以最大程度地发挥多流程序的性能,提高GPU资源的利用率。在实践中,通过使用性能分析工具(如NVIDIA Visual Profiler)可以更好地了解程序在GPU上的执行情况,帮助识别性能瓶颈和进行进一步的优化。

6. Cuda内存管理,资源申请及内存释放

CUDA内存管理是GPU编程中的重要方面,合理的资源申请和内存释放可以显著影响程序的性能。以下是一些CUDA内存管理的优化方案:

资源申请:

  1. 使用静态内存分配:

    • 对于大小已知且固定的数据结构,可以使用静态内存分配,即通过定义数组或结构体来分配内存。这样可以避免动态内存分配的开销和管理。
  2. 使用共享内存:

    • 在CUDA编程中,共享内存是每个线程块(block)私有的高速缓存,对于线程块内的线程可以共享数据。共享内存的访问速度比全局内存快得多。
    • 将频繁访问的数据放入共享内存,以提高访问速度。
  3. 使用纹理内存:

    • 对于某些访问模式,如全局内存的随机访问,可以考虑使用纹理内存。纹理内存具有缓存机制,适用于某些数据访问模式,可以提高存取效率。
  4. 延迟内存分配:

    • 在程序初始化阶段,将可能的内存分配推迟到真正需要使用时。这样可以避免在启动时一次性分配大量内存,节省资源。

内存释放:

  1. 手动管理内存:

    • 在某些情况下,手动管理内存的释放可以提高性能。CUDA提供了cudaMalloccudaFree等函数,可以手动分配和释放内存。
  2. 使用对象池(Object Pool):

    • 对于需要频繁创建和销毁的对象,可以考虑使用对象池。对象池在程序初始化时分配一块内存,然后重复使用其中的对象,而不是频繁地进行内存分配和释放。
  3. 内存合并:

    • 当多个小内存块需要释放时,可以考虑将它们合并成一个较大的内存块,再进行释放。这可以减少内存碎片,提高内存利用率。
  4. 使用统一内存:

    • 对于一些较新的NVIDIA GPU,支持统一内存(Unified Memory)。统一内存可以由CPU和GPU同时访问,CUDA运行时会自动进行数据迁移。使用统一内存可以简化内存管理,但需要注意性能开销。
  5. 注意内存对齐:

    • 确保数据结构和数组的内存对齐,以提高访问效率。可以使用cudaMallocPitch等函数来分配按照特定对齐方式的内存。
  6. 使用内存池:

    • 对于多次申请和释放同样大小的内存块,可以使用内存池,避免频繁的内存分配和释放,提高效率。

在进行内存管理时,除了考虑性能,还需要考虑代码的可读性和维护性。选择适当的内存管理策略取决于具体应用场景和需求。在进行优化时,建议通过性能分析工具(如NVIDIA Visual Profiler)来评估和验证内存管理的效果

7. GPU中tensor core及cuda core的关系

  1. 简单介绍一下 tensor core 和 cuda core
    1. Tensor Cores 是 NVIDIA GPU 中的一种硬件功能,旨在加速深度学习任务的矩阵乘法运算。CUDA Cores 是 GPU 中的通用处理单元,负责执行通用的计算任务。

      在 NVIDIA Volta 架构及之后的一些架构中,Tensor Cores 被引入以提高深度学习任务的性能。这些 Tensor Cores 是在 GPU 的 SM(Streaming Multiprocessor)中的特殊功能单元,与传统的 CUDA Cores 不同。Tensor Cores 主要用于执行矩阵乘法运算,这是深度学习中的一个关键操作。

      下面是 Tensor Cores 和 CUDA Cores 之间的关系:

    2. CUDA Cores:

      • CUDA Cores 是通用的处理单元,负责执行通用的 GPU 计算任务。它们可以执行各种类型的指令,适用于广泛的计算工作负载,包括图形渲染、科学计算、物理模拟等。
      • 在深度学习任务中,CUDA Cores 也会执行一些通用的计算,但并不专门优化矩阵乘法等深度学习操作。
    3. Tensor Cores:

      • Tensor Cores 是一种专门用于执行深度学习中矩阵乘法运算的硬件单元。它们采用低精度(通常是半精度浮点数)运算,通过同时处理多个元素来提高计算性能。
      • Tensor Cores 通常以矩阵乘法的形式工作,如 A*B=C,其中 A、B 和 C 都是矩阵。Tensor Cores 对于矩阵乘法的计算效率更高。
  2. tensor core的实现原理
    1. Mixed-Precision Arithmetic:

      • Tensor Cores 使用混合精度算术进行计算,主要包括浮点 16 位(half precision)和整数 32 位(integer)计算。
      • 输入和输出通常是浮点 16 位,而中间计算过程可能使用整数 32 位。
    2. 4x4 Matrix Multiply and Accumulate(MMA):

      • Tensor Cores 主要通过 4x4 矩阵乘法和累加(MMA)来执行计算。这意味着它们能够同时处理 4x4 的矩阵块,从而实现更高的计算并行度。
      • 计算过程中,输入矩阵被加载到 Tensor Cores 中,进行 4x4 矩阵乘法,然后结果累加到输出矩阵中。
    3. 数据压缩:

      • Tensor Cores 使用权重和激活值的低精度表示,从而减少了内存带宽需求和计算开销。
      • 例如,在矩阵乘法计算中,通常使用 float16 数据类型进行计算,减少了数据传输和计算时的存储需求。
    4. Fused Multiply-Add(FMA):

      • Tensor Cores 支持融合乘法累加(FMA)操作,即乘法和加法可以在一个时钟周期内完成。
      • 这使得 Tensor Cores 能够在单个指令中同时执行乘法和累加,提高计算效率。
    5. 独立单元:

      • Tensor Cores 是 GPU 中的特殊硬件单元,与 CUDA Cores 独立。它们具有专门的电路和指令集,用于执行深度学习中的矩阵乘法。
    6. 支持 FP16 和 INT8 算术:

      • Tensor Cores 可以执行浮点 16 位(FP16)和整数 8 位(INT8)的混合精度计算,以适应不同的深度学习模型需求。
  3. fp16 非卷积和矩阵乘预算是在哪里执行
    1. 简而言之:
      1. 矩阵乘法: Tensor Cores 设计用于加速大规模矩阵乘法运算,专门使用 FP16 或 INT8 数据类型。

      2. 非矩阵操作: 除矩阵乘法之外的操作,例如卷积、逐元素操作和其他非矩阵数学运算,通常由 CUDA Cores 完成。

      3. 在使用 TensorFlow 或 PyTorch 等深度学习框架时,框架会在支持的 GPU 上自动利用 Tensor Cores 加速适用的矩阵运算。对于非矩阵操作,CUDA Cores 负责执行计算。

        值得注意的是,不同 GPU 架构的确切功能和特性可能有所不同,而 Tensor Cores 的利用也取决于深度学习框架的实现和配置方式。

  4. 如何高效的使用tensor core 和cuda core
    1. 高效使用 Tensor Cores:

    2. 使用 FP16 数据类型:

      • Tensor Cores 主要用于加速 FP16(float16)计算。确保你的深度学习模型和框架支持使用 FP16 数据类型。
    3. 合理设置混合精度:

      • 在深度学习框架中,如 TensorFlow 和 PyTorch,启用混合精度训练(mixed precision training)。这样可以在前向传播时使用 FP16 计算,从而利用 Tensor Cores 进行加速。
    4. 注意数据范围:

      • 由于 FP16 的数据范围相对较小,确保在使用时不会导致数值溢出或损失过多的精度。
    5. 优化数据传输:

      • 减少主机与设备之间的数据传输次数,使用异步传输和页锁定内存(pinned memory)来优化数据传输性能。
    6. 减小线程阻塞:

      • 优化 CUDA Kernel 中的线程布局和块大小,以减小线程阻塞,确保 GPU 的计算资源得到最大利用。
    7. 使用共享内存:

      • 对于涉及共享内存的计算密集型任务,合理使用共享内存以提高访问速度。
    8. 减少数据竞争:

      • 考虑减少线程间的数据竞争,使用原子操作或其他同步机制以避免竞争条件。
    9. 并行任务划分:

      • 将任务划分成适当的大小,以充分利用 CUDA Cores 的并行性。这包括适当的网格和块大小设置。
    10. 使用 Warp-Level Primitives:

      • NVIDIA提供了 Warp-Level Primitives 库,其中包含了一些 Warp 级别的原语,可用于高效的 Warp 级别操作。
    11. 合理利用流:

      • 使用 CUDA 流(stream)以实现异步执行,充分利用 GPU 上的计算和数据传输资源。
    12. 适用性能分析工具:

      • 使用性能分析工具,如 NVIDIA Nsight、NVIDIA Visual Profiler 等,来评估和优化你的 CUDA Kernel 和整体程序性能。

相关文章:

高性能面试八股文之编译流程程序调度

1. C的编译流程 C语言程序的编译过程通常包括预处理&#xff08;Preprocessing&#xff09;、编译&#xff08;Compilation&#xff09;、汇编&#xff08;Assembly&#xff09;、链接&#xff08;Linking&#xff09;四个主要阶段。下面是这些阶段的详细说明&#xff1a; 1.…...

opencv的MinGW-W64编译

最近使用Qt&#xff0c;需要用到opencv,安装详情参考下面这个网址&#xff0c;写的挺好&#xff1a; opencv的MinGW-W64编译 - 知乎 我电脑安装Qt中自带了MinGW,所以不需要像上面网址中的下载MinGw&#xff0c;只需要将Qt中自带的MinGW添加到环境变量即可&#xff0c;如&…...

在Go编程中调用外部命令的几种场景

1.摘要 在很多场合, 使用Go语言需要调用外部命令来完成一些特定的任务, 例如: 使用Go语言调用Linux命令来获取执行的结果,又或者调用第三方程序执行来完成额外的任务。在go的标准库中, 专门提供了os/exec包来对调用外部程序提供支持, 本文将对调用外部命令的几种使用方法进行总…...

python学习:break用法详解

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 在执行while循环或者for循环时&#xff0c;只要循环条件满足&#xff0c;程序会一直执行循环体。 但在某些场景&#xff0c;我们希望在循环结束前就强制结束循环。 Python中有两种强制结束循环的方法&#xff1a; continue语…...

【算法萌新闯力扣】:找到所有数组中消失对数字

力扣热题&#xff1a;找到所有数组中消失对数字 开篇 这两天刚交了蓝桥杯的报名费&#xff0c;刷题的积极性高涨。算上打卡题&#xff0c;今天刷了10道算法题了&#xff0c;题目都比较简单&#xff0c;挑选了一道还不错的题目与大家分享。 题目链接:448.找到所有数组中消失对…...

Node.js 安装配置

文章目录 安装检测Node是否可用 安装 首先我们需要从官网下载Node安装包:Node.Js中文网,下载后双击安装没有什么特殊的地方&#xff0c;安装路径默认是C盘&#xff0c;不想安装C盘的话可以选择一下其他的盘符。安装完成以后可以不用配置环境变量&#xff0c;Node安装已经自动给…...

前端JS 使用input完成文件上传操作,并对文件进行类型转换

使用input实现文件上传 // 定义一个用于文件上传的按钮<input type"file" name"upload1" />// accept属性用于定义允许上传的文件类型&#xff0c; onchange用于绑定文件上传之后的相应函数<input type"file" name"upload2"…...

探索AI交互:Python与ChatGPT的完美结合!

大家好&#xff01;我是爱摸鱼的小鸿&#xff0c;人生苦短&#xff0c;我用Python&#xff01;关注我&#xff0c;收看技术干货。 随着人工智能的迅速发展&#xff0c;AI交互正成为技术领域的一大亮点。在这个过程中&#xff0c;Python编程语言和ChatGPT模型的结合展现出强大的…...

CI/CD - jenkins

目录 一、部署 1、简介 2、部署 二、配置 三、实时触发 四、自动化构建docker镜像 五、通过ssh插件交付任务 六、添加jenkins节点 七、RBAC 八、pipeline 九、jenkins结合ansible参数化构建 1、安装ansible 2、新建gitlab项目 3、jenkins新建项目playbook 一、部…...

【【萌新的SOC学习之 VDMA 彩条显示实验之一】】

萌新的SOC学习之 VDMA 彩条显示实验之一 实验任务 &#xff1a; 本章的实验任务是 PS写彩条数据至 DDR3 内存中 然后通过 VDMA IP核 将彩条数据显示在 RGB LCD 液晶屏上 下面是本次实验的系统框图 VDMA 通过 HP接口 与 PS端的 DDR 存储器 进行交互 因为 VDMA 出来的是 str…...

相机通用类之海康相机,软触发硬触发(飞拍),并输出halcon格式对象

//在此之前可以先浏览我编写的通用上位机类&#xff0c;更方便理解 https://blog.csdn.net/m0_51559565/article/details/134403745最近完成一个关于海康采图的demo&#xff0c;记录并说明用法。 先上代码。using System; using System.Collections.Generic; using System.Runt…...

linux时间调整

查看当前系统时间 [rootVM-12-12-centos ~]# date Sat Nov 18 16:09:11 CST 2023 Sat&#xff1a;表示星期六Saturday的缩写 Nov&#xff1a;表示十一月November的缩写 18&#xff1a;表示日期18号 16:09:11&#xff1a;时间 CST&#xff1a;China Standard Time中国标准…...

C++模版初阶

泛型编程 如下的交换函数中&#xff0c;它们只有类型的不同&#xff0c;应该怎么实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& right) {int temp left;left right;right temp; }void Swap(double& left, double& right) {double temp…...

​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第20章 系统架构设计师论文写作要点&#xff08;P717~728&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图...

Go 语言结构体验证详解:validate 标签与自定义规则

介绍 Go 语言中&#xff0c;结构体验证是保障数据完整性和正确性的重要手段之一。本文将深入探讨 validate 标签的使用方式&#xff0c;并介绍如何结合验证库 go-playground/validator 进行自定义验证规则。 安装与导入验证库 首先&#xff0c;请确保已安装验证库&#xff1a…...

​软考-高级-系统架构设计师教程(清华第2版)【第19章 大数据架构设计理论与实践 (P691~716)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第19章 大数据架构设计理论与实践 &#xff08;P691~716&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图...

深度学习YOLOv5车辆颜色识别检测 - python opencv 计算机竞赛

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…...

c语言-浅谈指针(3)

文章目录 1.字符指针变量常见的字符指针初始化另一种字符指针初始化例&#xff1a; 2.数组指针变量什么是数组指针变量数组指针变量创建数组指针变量初始化例&#xff08;二维数组传参的本质&#xff09; 3.函数指针变量什么是函数指针变量呢&#xff1f;函数指针变量创建函数指…...

从服务器端获取人脸数据,在本地检测特征,并将特征发送给服务器

目录 1.定义函数get_database_process&#xff1a; 2.定义函数features_construct&#xff1a; 3.定义函数send_features_data&#xff1a; 4. 定义函数database_features_construct&#xff1a; 5. main 函数 1.定义函数get_database_process&#xff1a; …...

ARDUINO UNO 12颗LED超酷流水灯效果

效果代码&#xff1a; #define t 30 #define t1 20 #define t2 100 #define t3 50 void setup() { // set up pins 2 to 13 as outputs for (int i 2; i < 13; i) { pinMode(i, OUTPUT); } } /Effect 1 void loop() { effect_1(); effect_1(); effect_…...

Linux下查看pytorch运行时真正调用的cuda版本

一般情况我们会安装使用多个cuda版本。而且pytorch在安装时也会自动安装一个对应的版本。 正确查看方式&#xff1a; 想要查看 Pytorch 实际使用的运行时的 cuda 目录&#xff0c;可以直接输出 cpp_extension.py 中的 CUDA_HOME 变量。 import torch import torch.utils imp…...

​分享mfc140u.dll丢失的解决方法,针对原因解决mfc140u.dll丢失的问题

作为电脑小白&#xff0c;如果电脑中出现了mfc140u.dll丢失的问题&#xff0c;肯定会比较的慌乱。但是出现mfc140u.dll丢失的问题&#xff0c;其实也有很简单的办法&#xff0c;所以大家不用慌张&#xff0c;接下来就教大家解决办法&#xff0c;能够有效的解决mfc140u.dll丢失的…...

torch_cluster、torch_scatter、torch_sparse三个包的安装

涉及到下面几个包安装的时候经常会出现问题&#xff0c;这里我使用先下载然后再安装的办法&#xff1a; pip install torch_cluster pip install torch_scatter pip install torch_sparse 1、选择你对应的torch版本&#xff1a;https://data.pyg.org/whl/ 2、点进去然后&…...

软件安利——火绒安全

近年来&#xff0c;以优化、驱动、管理为目标所打造的软件屡见不鲜&#xff0c;大同小异的电脑管家相继走入了公众的视野。然而&#xff0c;在这日益急功近利的社会氛围驱动之下&#xff0c;真正坚持初心、优先考虑用户体验的电脑管家逐渐湮没在了浪潮之中。无论是鲁大师&#…...

Induced AI:一个专门为自动化任务而设计的AI原生浏览器RPA平台

​内容来源&#xff1a;xiaohuggg Induced AI&#xff1a;一个专门为自动化任务而设计的AI原生浏览器RPA平台 刚刚获得OpenAI CEOsama的个人投资&#xff01; 它能够模拟人类浏览网页的行为&#xff0c;自动化地浏览网页&#xff0c;搜集关键信息&#xff0c;并对这些信息进行…...

vue3中使用reactive定义的变量响应式丢失问题(大坑!!!)

前言 在Vue 3中&#xff0c;可以使用reactive函数将普通JavaScript对象转换为响应式对象&#xff0c;这样当对象的属性发生变化时&#xff0c;就会自动更新相应的UI。 但是请注意以下情况可能会丢失数据的响应式&#xff1a; 响应式丢失的情况&#xff1a; 1、对使用reactiv…...

Windows Server 2012 R2系统服务器远程桌面服务多用户登录配置分享

Windows Server 2012系统在没有安装远程多界面的情况下&#xff0c;最多只能同时运行2个远程桌面&#xff0c;如果是有多个技术员、合伙人同时操作或是像游戏开发需要用到多界面&#xff0c;但是没有安装就很不方便&#xff0c;今天飞飞来和你们分享Windows server 2012R2系统远…...

mysql之搭建MHA架构实现高可用

1、定义 全称是masterhigh avaliabulity。基于主库的高可用环境下可以实现主从复制及故障切换&#xff08;基于主从复制才能故障切换&#xff09; MHA最少要求一主两从&#xff0c;半同步复制模式 2、作用 解决mysql的单点故障问题。一旦主库崩溃&#xff0c;MHA可以在0-30…...

Databend 与海外某电信签约:共创海外电信数据仓库新纪元

为什么选择 Databend 海外某电信面临的主要挑战是随着业务量的增加&#xff0c;传统的 Clickhouse Hive 方案在数据存储和处理上开始显露不足。 原来的大数据分析采用的 Clickhouse Hive 方案进行离线的实时报表。但随着业务量的上升后&#xff0c;Hive的数据存储压力变大&…...

scala解析命令行参数

如何用scala解析命令行参数&#xff1a; 首先&#xff0c;需要在项目中添加Apache Commons CLI库的依赖。可以在build.sbt文件中添加如下行&#xff1a; libraryDependencies "commons-cli" % "commons-cli" % "1.4" import org.apache.comm…...

盘点60个Python各行各业管理系统源码Python爱好者不容错过

盘点60个Python各行各业管理系统源码Python爱好者不容错过 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 源码下载链接&#xff1a;https://pan.baidu.com/s/1VdAFp4P0mtWmsA158oC-aA?pwd8888 提取码&#xff1a;8888 项目名…...

SpringSecurity6 | 自动配置(下)

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…...

6、传统CV之均值滤波

在前5节,从最基础的像素开始了介绍,并且着重介绍了像素局部性、RGB图片和YUV图片以及通道的概念。 其实写那么多,很多细节知识也不用都学会,只需要知道计算机在处理图片时,看到的都是一堆像素,而这一堆像素,都是以数据点的形式存放在计算机中的。 为了更好的展示图像和…...

快速搭建本地的chatgpt

快速搭建本地的chatgpt 参考&#xff1a;一篇文章教你使用Docker本地化部署Chatgpt&#xff08;非api&#xff0c;速度非常快&#xff01;&#xff01;&#xff01;&#xff09;及裸连GPT的方式&#xff08;告别镜像GPT&#xff09;-CSDN博客 前提是linux下 已安装docker 命…...

分布式下多节点WebSocket消息收发

1、使用场景 2、疑问 第一次发送请求后&#xff0c;通过N1&#xff0c;W2&#xff0c;到达service2&#xff0c;建立websocket连接。 1、接下来发送的消息&#xff0c;通过Ngixn后和网关gateway后还能落在service2上面吗&#xff1f; 如果不能落在service2上&#xff0c;需要怎…...

LeetCode算法题解(动态规划)|LeetCode509. 斐波那契数、LeetCode70. 爬楼梯、LeetCode746. 使用最小花费爬楼梯

一、LeetCode509. 斐波那契数 题目链接&#xff1a;509. 斐波那契数 题目描述&#xff1a; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a…...

【图像处理】:Otsu算法最大类间方差法(大津算法:附源码)

这里写自定义目录标题 数学原理算法评价参考链接 数学原理 以灰度图像为例&#xff0c;对于图像MN大小的矩阵&#xff0c;即图像中的像素&#xff0c;每一个值即为像素值&#xff0c;其中灰度图像像素值在(0~255)之间。 主要实现前景(即目标)和背景的分割&#xff1a; 主要公式…...

【uni-app】设置背景颜色相关

1. 全局页面背景色设置&#xff1a; 在App.vue的style样式表中设置 <style> page {background-color: #F0AD4E; } </style> 2. 顶部导航栏背景色设置&#xff1a; 在pages.json页面路由中&#xff0c;globalStyle设置 "globalStyle": {"navi…...

工厂模式-C++实现

工厂模式是一个创建型设计模式&#xff0c;即“对象创建模式”&#xff0c;通过这种模式可以绕开new&#xff0c;来避免对象创建过程中&#xff0c;也就是new的方法造成的紧耦合&#xff0c;从而支持对象创建的稳定。 工厂模式中引入了一个工厂类&#xff0c;该工厂负责根据客…...

安装应用与免安装应用差异对比

差异 安装的程序和免安装的应用程序之间有以下几个方面的差别&#xff1a; 安装过程&#xff1a;安装的程序需要通过一个安装程序或安装脚本进行安装。这个过程通常会将应用程序的文件和依赖项复制到指定的目录&#xff0c;并进行一些配置和注册操作。免安装的应用程序则不需要…...

FiscoBcos使用Go调用合约

环境&#xff1a; fisco2.8.0 go 1.17 go-sdk 1.0.0 solidity 0.4.25 前言 请提前启动好四个fisco节点。 请准备好一个属于此fisco节点的账户私钥【待会调用合约和部署合约会用到】 此文章将讲解 官方文档使用gosdk部署helloworld合约并调用其方法 合约开发样例 官网提示 G…...

自然语言处理(NLP)-spacy简介以及安装指南(语言库zh_core_web_sm)

spacy 简介 spacy 是 Python 自然语言处理软件包&#xff0c;可以对自然语言文本做词性分析、命名实体识别、依赖关系刻画&#xff0c;以及词嵌入向量的计算和可视化等。 1.安装 spacy 使用 “pip install spacy" 报错&#xff0c; 或者安装完 spacy&#xff0c;无法正…...

CTF-PWN-tips

文章目录 overflowscanfgetreadstrcpystrcat Find string in gdbgdbgdb peda Binary ServiceFind specific function offset in libc手工自动 Find /bin/sh or sh in library手动自动 Leak stack addressFork problem in gdbSecret of a mysterious section - .tlsPredictable …...

《Effective C++》条款21

必须返回对象时&#xff0c;别妄想返回其reference 如果你的运算符重载函数写成了返回reference的形式&#xff1a; class A { public:A(int a,int b):x(a),y(b){}friend const A& operator*(const A& a, const A& b); private:int x;int y; }; const A& opera…...

决策树,sql考题,30个经典sql题目

大数据&#xff1a; 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sql要学&#x…...

【ES6.0】- 扩展运算符(...)

【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

关于Java中的深拷贝与浅拷贝

Java中的深拷贝和浅拷贝是针对对象和数组等引用数据类型的复制操作。 浅拷贝&#xff08;Shallow Copy&#xff09;&#xff1a; 对于基本数据类型&#xff0c;浅拷贝直接复制其值。对于引用数据类型&#xff0c;浅拷贝只复制对原对象的引用&#xff0c;而不是复制对象本身。因…...

13.真刀实枪做项目---博客系统(页面设计)

文章目录 1.预期效果1.1博客列表页效果1.2博客详情页效果1.3博客登陆页效果1.4博客编辑页效果 2.实现博客列表页2.1实现导航栏2.2实现版心2.3实现个人信息2.4实现博客列表2.5博客列表页完整代码 3.实现博客正文页3.1引入导航栏3.2引入版心3.3引入个人信息3.4实现博客正文3.5博客…...

VScode 配置用户片段

文件->首选项->配置用户片段->新建全局用户片段 后续就可以通过vv3来直接生成下面的代码 {// Place your 全局 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and // description. Add comma separated ids of the l…...

Fedora 项目近日发布了 Fedora Linux 39

导读几经推迟之后&#xff0c;Fedora 项目近日发布了 Fedora Linux 39&#xff0c;这是红帽公司赞助的面向大众的 GNU/Linux 发行版的最新稳定版本&#xff0c;采用了最新的技术和开源应用程序。 Fedora Linux 39 由 Linux 内核 6.5 支持&#xff0c;并提供了一些最新的桌面环境…...