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

cuda面试准备(一),架构调试

1 cuda架构

在这里插入图片描述

硬件方面

  • SP (streaming Process) ,SM (streaming multiprocessor) 是硬件(GPUhardware) 概念。而thread,block,grid,warp是软件上的(CUDA) 概念

  • SP:最基本的处理单元,streaming processor,也称为CUDA core,最后具体的指令和任务都是在SP上处理的。GPU进行并行计算,也就是很多个SP同时做处理。

  • SM: 多个SP加上其他的一些资源组成一个streaming multiprocessor。也叫GPU大核,其他资源如:warp scheduler,register, shared memory等。SM可以看做GPU的心脏(对比CPU核心),register和shared memory是SM的稀缺资源。CUDA将这些资源分配给所有驻留在SM中的threads因此,这些有限的资源就便每个SM中active warps有非常严格的限制,也就限制了并行能力,每个SM包念的SP数量依据GPU架构而不同

软件方面

  • Wrap:(线程束)GPU执行程序时的调度单位,一起执行,目前cuda的warp的大小为32,同在一个Warp :的线程,以不同数据资源执行相同的指令。
  • grid、block、thread: 在利用cuda进行编程时,一个grid分为多个block,而一个block分为多个thread.其中任务划分到是否影响最后的执行效果。划分的依据是任务特性和GPU本身的硬件特性。

强推

https://face2ai.com/program-blog/#GPU%E7%BC%96%E7%A8%8B%EF%BC%88CUDA%EF%BC%89

2 利用图形API和CUDA进行GPU通用计算的性能差别

需要将问题转化成图形学,而CUDA使用C语言编写,适合做通用计算
GPU指令和CPU指令 最大区别:CPU需要运行OS,不但要处理中断,还要负责存储器空间分配回收,GPU不需要做这些,所以GPU很空闲

3 GPU架构缺点

  1. 复杂性: GPU架构通常比CPU复杂,因为它们需要管理大量的并行单元、内存层次结构和调度器。这使得设计、开发和调试GPU架构变得更加复杂。

  2. 通用计算限制: 初衷是为图形渲染设计的GPU架构在执行通用计算时可能受到一些限制。例如,一些硬件特性和指令集可能不适用于所有类型的计算任务。

  3. 内存层次结构: GPU具有复杂的内存层次结构,包括全局内存、共享内存和寄存器等。管理和优化数据在这些内存层次之间的传输和访问是挑战之一,可能影响性能。

  4. 数据传输成本: 在GPU计算中,数据传输成本往往较高,特别是在主机内存和GPU内存之间传输数据。这可能导致在处理大量数据时产生性能瓶颈。

  5. 程序设计复杂性: 为了充分利用GPU的并行计算能力,需要编写高度并行的代码,涉及线程、块、网格等概念。这可能增加了程序设计的复杂性,容易引入并发错误。

  6. 并发调度和同步: 在GPU上管理并发执行和同步操作是复杂的任务。正确管理并发执行以避免竞态条件和死锁需要仔细的设计和编程。

如果让我设计GPU架构,我可能会考虑以下方面:

  1. 通用计算优化: 设计一种架构,既能够优化图形渲染任务,又能够高效执行通用计算任务。这可能涉及设计更多通用计算单元、灵活的指令集等。

  2. 内存和数据传输优化: 确保内存层次结构能够有效地管理数据传输和访问,最小化数据传输成本。可能需要更智能的缓存管理和数据预取策略。

  3. 简化编程模型: 设计更简化的编程模型,减少编写并行代码的复杂性。可能通过更高级别的抽象、自动并行化工具等来实现。

  4. 高效的并发管理: 设计一种可靠且高效的并发管理机制,能够自动处理并发调度、同步和互斥操作,降低并发编程的难度。

  5. 灵活性: 考虑在架构中引入一定程度的灵活性,以适应不同类型的计算任务。可能通过可配置的硬件模块、指令扩展等方式实现。

  6. 能效优化: 设计能够在高性能的同时保持良好能效的架构。可能需要在硬件级别上优化功耗管理和调度策略。

需要指出的是,设计一种全面优化且符合所有需求的GPU架构是一个极具挑战性的任务,涉及硬件、软件、算法等多个方面的考虑。实际的GPU架构设计通常需要平衡不同需求,并在性能、能效、成本等方面做出权衡。

GPU的缓存管理和数据预取策略

是为了最大程度地减少内存访问延迟,提高访存效率和整体计算性能。由于GPU具有复杂的内存层次结构(如寄存器、共享内存、全局内存等),在设计缓存管理和数据预取策略时需要考虑不同层次的内存以及数据访问模式。以下是一些常见的缓存管理和数据预取策略:

缓存管理策略:

  1. 层次化缓存: GPU通常具有多级缓存,如L1缓存、L2缓存等。较小但更快的L1缓存可以存储频繁使用的数据,而较大但稍慢的L2缓存可以存储更多的数据。合理地将数据分布到不同级别的缓存中可以减少内存访问延迟。

  2. 缓存行(Cache Line): 缓存通常以缓存行为单位进行数据加载,即加载一个缓存行大小的数据。设计合适的缓存行大小可以匹配数据访问模式,减少不必要的数据传输。

  3. 写缓冲(Write Buffer): 为了提高写入操作的效率,GPU可能会采用写缓冲,将写入操作缓存在缓冲区中,然后一次性写回内存。这可以降低写入操作的延迟。

数据预取策略:

  1. 空间局部性预取: 当GPU访问一个内存位置时,往往会连续访问相邻的内存位置。预取机制可以提前将相邻数据加载到缓存中,以利用空间局部性。

  2. 时间局部性预取: 当GPU多次访问同一内存位置时,预取机制可以提前将该数据加载到缓存中,以利用时间局部性。

  3. 非阻塞预取: 在数据预取时,可以使用非阻塞方式加载数据,以避免阻塞计算单元,提高并发性能。

  4. 自适应预取: 一些GPU架构具有自适应预取功能,可以根据访存模式动态调整预取策略,以适应不同的应用场景。

  5. 预取距离: 预取时加载数据的距离也是一个重要因素。加载过远的数据可能会浪费带宽,而加载过近的数据可能会引发访存竞争。因此,预取距离的选择需要考虑数据访问模式。

综合来看,缓存管理和数据预取策略的设计需要结合具体的GPU架构、应用场景和数据访问模式。优化这些策略可以在保持高性能的同时,减少内存访问的延迟,提高计算效率。

4 GPU通过并行执行成千上万个线程来隐藏延迟访问,这是其高性能计算的一个关键机制之一。

这种并行模型允许GPU在等待某些线程的数据访问结果时,可以切换到执行其他线程的计算,从而在某些情况下有效地隐藏内存访问延迟。

这种并行执行的机制可以分为以下几个方面:

  1. 线程块和网格: GPU任务被划分为多个线程块(Thread Block),每个线程块包含多个线程。线程块是调度的基本单元,多个线程块构成一个网格(Grid)。

  2. 调度器: GPU调度器将线程块分配给可用的多处理器(SM,Streaming Multiprocessor),并在多个线程块之间切换执行,以最大限度地利用可用的计算资源。

  3. 线程束: 在SM内部,线程块会被分成小的线程束(Thread Warp)。线程束中的线程可以同时执行相同的指令,从而减少指令调度的开销。

  4. 延迟隐藏: 当一个线程块等待某些数据的到来时(例如,从内存中加载数据),GPU可以切换到执行其他线程块,从而隐藏内存访问的延迟。

  5. 多级并行: GPU同时支持多个线程块在不同的SM上执行,每个SM内部又支持多个线程束的并行执行,从而实现多级并行的计算。即:GPU通常采用多级并行结构,如线程块(Thread Block)、线程束(Warps)等。线程块中的线程会被划分为多个线程束,每个线程束内的线程共享相同的指令流,但可以独立执行不同的数据操作。这种多级并行结构使得GPU能够同时执行大量的线程,进一步隐藏内存访问延迟。

这种并行模型在大规模并行计算中非常有效,尤其适用于需要大量数据并行计算的任务,如图像处理、深度学习训练等。通过同时执行多个线程块,GPU能够利用可用的计算资源来充分利用计算能力,即使在存在内存访问延迟的情况下也能保持高效率。

需要注意的是,有效利用并行模型需要开发者合理划分任务、优化数据访问模式,并且确保避免竞态条件和数据不一致性等问题。因此,在编写并行GPU代码时,开发者需要考虑线程同步、数据共享和优化等方面的问题。

5 列举一些常用的线程同步、数据共享和优化的方法

在GPU并行计算中,线程同步、数据共享和优化是非常重要的方面,可以影响程序的正确性和性能。以下是一些常用的方法:

线程同步方法:

  1. 栅栏同步(Barrier): 在线程块内部使用栅栏同步机制,确保所有线程在某个点上等待,直到所有线程都达到该点。

  2. 原子操作(Atomic Operations): 使用原子操作来确保在多个线程同时访问共享数据时的数据一致性,如原子加法、原子比较交换等。

  3. 互斥锁(Mutex): 可以使用互斥锁来保护临界区,防止多个线程同时访问共享资源。但在GPU中,锁可能引入较大的性能开销,因此需要慎重使用。

  4. Semaphore(信号量): 信号量是一种同步机制,允许一定数量的线程同时访问共享资源。GPU中使用信号量可以协调线程对有限资源的访问。

以下是关于常见线程同步方法的代码示例,以及它们的优缺点和适用范围。

示例 1: Barrier(栅栏)

__global__ void kernel_with_barrier() {// 执行一些计算操作// 等待所有线程完成计算,然后继续执行__syncthreads();// 继续后续操作
}

优点:

  • 适用于需要在线程块内进行协同操作的场景。
  • 提供了明确的同步点,确保所有线程在继续执行之前达到同步。

缺点:

  • 栅栏同步可能导致线程的等待时间增加,影响性能。

适用范围:

  • 在线程块内需要同步操作的情况下,如某些计算依赖其他线程的结果。

示例 2: Atomic Operations(原子操作)

__global__ void kernel_with_atomic(int* data) {int threadId = threadIdx.x;// 原子增加共享变量atomicAdd(data, threadId);// 继续后续操作
}

优点:

  • 适用于需要对共享变量进行原子操作的情况,以避免竞态条件, 使用原子操作来确保在多个线程同时访问共享数据时的数据一致性,如原子加法、原子比较交换等。
  • 确保数据的一致性,无需额外的锁。

缺点:

  • 原子操作可能引入性能开销。

适用范围:

  • 当多个线程需要更新共享变量时,以避免竞态条件。

示例 3: Mutex(互斥锁)

__global__ void kernel_with_mutex(int* data, mutex_t* lock) {int threadId = threadIdx.x;// 加锁lock_mutex(lock);// 访问共享资源(*data) += threadId;// 解锁unlock_mutex(lock);// 继续后续操作
}

优点:

  • 适用于需要保护共享资源的情况,确保一次只有一个线程能够访问。
  • 提供明确的同步和互斥机制。

缺点:

  • 使用互斥锁可能会导致性能下降,因为锁可能引起线程阻塞。

适用范围:

  • 在需要保护共享资源、避免并发冲突的情况下。

示例 4: Semaphore(信号量)

__global__ void kernel_with_semaphore(int* data, semaphore_t* sem) {int threadId = threadIdx.x;// 等待信号量wait_semaphore(sem);// 访问共享资源(*data) += threadId;// 释放信号量release_semaphore(sem);// 继续后续操作
}

优点:

  • 适用于需要限制对有限资源的并发访问数量的情况。
  • 可以防止资源的过度使用。

缺点:

  • 错误的使用信号量可能导致死锁或资源争夺等问题。

适用范围:

  • 当需要限制对某些资源的并发访问数量时,如连接池或线程池等。

请注意,这些示例只是基本演示,实际应用中需要根据具体需求和GPU编程框架进行适当的修改和实现。在选择线程同步方法时,需要权衡其性能、复杂性以及适用范围,并根据具体情况进行调整。

数据共享方法:

  1. 共享内存: 在线程块内部使用共享内存来共享数据,这种内存可以在线程块内高效地进行读写,有助于减少对全局内存的访问。
__global__ void kernel_with_shared_memory(float* input, float* output) {extern __shared__ float shared_data[];int tid = threadIdx.x;shared_data[tid] = input[tid];  // 将数据从全局内存拷贝到共享内存__syncthreads();  // 等待所有线程完成数据拷贝// 在共享内存中进行数据操作// ...output[tid] = shared_data[tid];  // 将数据从共享内存拷贝回全局内存
}
  1. 线程束通信: 在某些GPU架构中,线程束内的线程可以通过特定的指令进行快速通信,可以用于线程级别的数据共享。

优化方法:

  1. 内存访问模式优化: 优化内存访问模式,尽量保证线程在访问内存时是连续的,以提高缓存命中率。例如,使用合并访问、空间局部性等方法。
__global__ void optimized_memory_access(float* input, float* output) {int tid = blockIdx.x * blockDim.x + threadIdx.x;// 每个线程处理多个数据,减少全局内存访问次数for (int i = tid; i < N; i += blockDim.x * gridDim.x) {output[i] = input[i] * 2.0f;  // 计算并写回结果}
}
  1. 循环展开: 对循环进行展开,将多次迭代的计算放在同一个循环中,以减少循环开销。
__global__ void loop_unrolling(float* input, float* output) {int tid = threadIdx.x;int idx = blockIdx.x * blockDim.x + tid;// 循环展开,每次处理多个数据for (int i = 0; i < 4; ++i) {output[idx + i * blockDim.x] = input[idx + i * blockDim.x] * 2.0f;}
}
  1. 数据复用: 尽量复用计算中的中间结果,避免重复计算,减少计算开销。
__global__ void data_reuse(float* input, float* output) {int tid = blockIdx.x * blockDim.x + threadIdx.x;float value = input[tid];float result = value * 2.0f;// 多次使用同一个中间结果for (int i = 0; i < 10; ++i) {result += value;}output[tid] = result;
}
# 数据精度优化 避免使用过高的精度
__global__ void data_precision(float* input, double* output) {int tid = blockIdx.x * blockDim.x + threadIdx.x;double value = static_cast<double>(input[tid]);  // 将数据转换为双精度output[tid] = value * 2.0;
}
  1. 向量化: 使用SIMD(单指令多数据)指令集,将多个数据元素一起处理,提高计算密集型任务的性能。

  2. 避免分支: 尽量避免在并行代码中使用分支,因为分支可能导致线程束内的线程执行不同的路径,降低并行性。

  3. 减少全局内存访问: 尽量减少对全局内存的访问,使用共享内存、常量内存等来存储常用数据。

  4. 编译器优化: 使用适当的编译器标志和优化选项,以便编译器能够生成更高效的机器码。

  5. 并行模式选择: 根据问题的特点,选择适合的并行模式,如数据并行、任务并行等。

总的来说,GPU并行计算的优化是一个综合考虑硬件特性、算法、数据布局等多个方面的任务。需要根据具体的问题和硬件架构进行调整和优化,以实现最佳的性能和效率。

6 cuda编程同步方法及其示例代码

在CUDA编程中,有几种常见的同步方法用于协调线程之间的执行顺序和数据一致性。以下是一些常用的CUDA编程同步方法及其示例代码:

1. __syncthreads() 这是在线程块内同步线程的最常见方法。它确保在调用该函数之前的所有线程都完成了各自的操作,然后才允许线程继续执行。

示例代码:

__global__ void kernel_with_syncthreads(float* data) {int tid = threadIdx.x;// 执行一些操作// 等待所有线程完成操作,然后继续__syncthreads();// 继续后续操作
}

2. atomicAdd() 这是一种原子操作,用于对全局内存中的共享变量执行原子增加操作。它可以避免多个线程同时更新共享变量时的竞态条件。 允许多个线程在无竞争的情况下对共享变量执行原子更新,以避免竞态条件

示例代码:

__global__ void kernel_with_atomic_add(int* data) {int tid = threadIdx.x;// 原子增加共享变量atomicAdd(data, tid);// 继续后续操作
}

3. 互斥锁(Mutex): 通过CUDA提供的mutex库,可以在线程块内使用互斥锁来实现临界区的保护,确保一次只有一个线程可以进入。

示例代码:

#include <cuda_runtime.h>
#include <device_functions.h>__global__ void kernel_with_mutex(int* data, int* mutex) {int tid = threadIdx.x;// 加锁while (atomicCAS(mutex, 0, 1) != 0) {// 等待锁被释放}// 访问共享资源(*data) += tid;// 解锁atomicExch(mutex, 0);// 继续后续操作
}

4. 共享内存(Shared Memory): 共享内存是在线程块内部的线程共享的内存空间,可以用于在线程之间传递数据,以及提高数据访问效率。

示例代码:

__global__ void kernel_with_shared_memory(float* input, float* output) {extern __shared__ float shared_data[];int tid = threadIdx.x;shared_data[tid] = input[tid];// 等待共享内存中的数据准备完成__syncthreads();// 在共享内存中进行数据操作// ...output[tid] = shared_data[tid];
}
  1. Semaphore(信号量):

信号量是一种同步机制,可以用于控制多个线程对有限资源的访问。

示例代码:

__global__ void kernel_with_semaphore(int* data, semaphore_t* sem) {int tid = threadIdx.x;// 等待信号量wait_semaphore(sem);// 访问共享资源(*data) += tid;// 释放信号量release_semaphore(sem);
}
  1. Cooperative Groups(协作线程组):

协作线程组是CUDA 9及更高版本引入的概念,允许线程之间在更灵活的方式下进行同步。

示例代码:

#include <cooperative_groups.h>__global__ void kernel_with_cooperative_groups(float* input, float* output) {int tid = threadIdx.x;cooperative_groups::grid_group grid = cooperative_groups::this_grid();// 执行计算操作// 等待线程块内所有线程完成计算grid.sync();// 继续执行后续操作
}

这些同步方法可以帮助确保线程在执行计算时按预期的顺序进行,同时避免竞态条件和数据不一致性。选择合适的同步方法取决于具体的应用需求和情境。注意,错误的同步使用可能导致死锁、性能下降等问题,因此在实际编程中需要仔细设计和验证。

7 cuda11.4流并行相关

在CUDA编程中,**流(stream)是一种执行序列,可以用来表示在GPU上执行的一系列操作。**CUDA 11.4引入了新的流并行特性,使得在同一设备上可以并发执行多个流,从而进一步提高并行性和性能。以下是关于CUDA 11.4流并行相关的一些信息:

流(Stream):

流是一系列在GPU上执行的操作的序列。每个流内的操作按照添加到流中的顺序执行,但不同流之间的操作可以并行执行。CUDA 11.4引入了流优先级,允许开发者通过显式设置流的优先级来影响操作的调度顺序。

流并行性:

CUDA 11.4引入了新的流并行性特性,允许开发者在同一设备上并发执行多个流。这些流可以在不同的核心、SM(流处理器)上并行执行,从而提高了GPU的利用率和性能。
流并行是CUDA编程中的一个重要概念,它允许多个独立的计算流在GPU上并行执行,从而提高了并行性和性能。流并行可以用于同时执行多个独立的计算任务,从而更好地利用GPU资源。以下是有关流并行的一些进一步信息:

流(Stream):

在CUDA中,流是一系列GPU操作的序列,这些操作可以在设备上异步执行。每个流中的操作按照添加到流中的顺序执行,但不同流之间的操作可以并行执行。流的引入使得不同的计算任务可以同时执行,从而提高了整体的并行性。

流并行性的好处:

  • 资源利用率: 通过在同一设备上同时执行多个流,可以更好地利用GPU的计算资源,从而提高系统的资源利用率。
  • 任务隔离: 不同的流可以在不同的计算任务之间保持隔离,避免相互干扰。这对于一些需要并行执行的独立任务非常有用。
  • 响应性: 通过将一些计算任务放入不同的流中执行,可以使得GPU能够在执行计算的同时响应其他任务,提高系统的响应性。

流的创建和管理:

在CUDA中,可以使用cudaStreamCreate()创建流,使用cudaStreamDestroy()销毁流。可以使用cudaStreamS

相关文章:

cuda面试准备(一),架构调试

1 cuda架构 硬件方面 SP (streaming Process) ,SM (streaming multiprocessor) 是硬件(GPUhardware) 概念。而thread,block,grid,warp是软件上的(CUDA) 概念 SP:最基本的处理单元,streaming processor,也称为CUDA core,最后具体的指令和任务都是在SP上处理的。GPU进行并行…...

docker containers logs清理

容器的磁盘占用 每次创建一个容器时&#xff0c;都会有一些文件和目录被创建&#xff0c;例如&#xff1a; /var/lib/docker/containers/ID目录&#xff0c;如果容器使用了默认的日志模式&#xff0c;他的所有日志都会以JSON形式保存到此目录下。 /var/lib/docker/overlay2 目…...

Ubuntu安装RabbitMQ

一、安装 更新系统软件包列表&#xff1a; sudo apt update安装RabbitMQ的依赖组件和GPG密钥&#xff1a; sudo apt install -y curl gnupg curl -fsSL https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc | sudo gpg --dearmo…...

Vue3获取当前环境信息

获取.env.development和.env.production内的信息及环境信息 在业务逻辑文件中可以通过 import.meta.env的方式获取&#xff0c;例如&#xff1a; const { MODE, VITE_APP_BASE_API} import.meta.env在vite.config.js中获取&#xff1a; import { defineConfig, loadEnv } f…...

Linux 系统 diff 文件比较命令详解

diff 命令用于比较两个文件或目录之间的差异。它会逐行比较文件的内容&#xff0c;并且在不同的行上显示不同之处。下面是 diff 命令的使用方法和选项&#xff1a; 基本语法&#xff1a; diff [选项] 文件1 文件2常见选项&#xff1a; -c 或 --context&#xff1a;显示上下文…...

【负载均衡】Nacos简单入门

Nacos简单入门 快速安装 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; 下载完压缩包之后&#xff0c;放在任意目录下面进行解压&#xff1a; GitHub主页&#xff1a;https://github.com/alibaba/nacos G…...

实验一 ubuntu 网络环境配置

ubuntu 网络环境配置 【实验目的】 掌握 ubuntu 下网络配置的基本方法&#xff0c;能够通过有线网络连通 ubuntu 和开发板 【实验环境】 ubuntu 14.04 发行版FS4412 实验平台 【注意事项】 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行&#xff0c;以“#”开头的…...

ubuntu can应用开发环境搭建指南

sudo apt-get update sudo apt-get install can-utils libsocketcan-dev can数据发送这个采用来自网上的一段代码进行测试: can_send.c代码内容如下: /* 1. 报文发送程序 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <…...

全流程R语言Meta分析核心技术高阶应用

查看原文>>>全流程R语言Meta分析核心技术高阶应用 目录 专题一、Meta分析的选题与检索 专题二、Meta分析与R语言数据清洗及统计方法 专题三、R语言Meta分析与作图 专题四、R语言Meta回归分析 专题五、R语言Meta诊断分析 专题六、R语言Meta分析的不确定性 专题…...

windows下安装使用git-lfs克隆大文件

下载安装git-lfs工具 首先去git-lfs这里&#xff0c;下载相应平台的工具&#xff0c;我下载的windows版本&#xff0c;非安装版本&#xff0c;直接配置到系统环境变量里 执行以下命令验证是否成功 git lfs install 克隆数据集 这样自动会下载里边的大文件 git clone https:/…...

Node.js下载安装及环境配置教程

一、进入官网地址下载安装包 https://nodejs.org/zh-cn/download/ 选择对应你系统的Node.js版本&#xff0c;这里我选择的是Windows系统、64位 Tips&#xff1a;如果想下载指定版本&#xff0c;点击【以往的版本】&#xff0c;即可选择自己想要的版本下载 二、安装程序 &a…...

半导体低压热氧工艺中的真空度精密控制解决方案

摘要&#xff1a;在目前的各种半导体材料热氧化工艺中&#xff0c;往往需要对正负压力进行准确控制并对温度变化做出快速的响应&#xff0c;为此本文提出了热氧化工艺的正负压力控制解决方案。解决方案的核心是基于动态平衡法分别对进气和排气流量进行快速调节&#xff0c;具体…...

TCP的可靠性之道:确认重传和流量控制

TCP 全称为 Transmission Control Protocol&#xff08;传输控制协议&#xff09;&#xff0c;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;其中可靠性是相对于其他传输协议的优势点。TCP 为了确保数据传输的可靠性主要做了以下几点&#xff1a; 发送确…...

基于spring boot校园疫情信息管理系统/疫情管理系统

摘要 随着计算机技术&#xff0c;网络技术的迅猛发展&#xff0c;Internet 的不断普及&#xff0c;网络在各个领域里发挥了越来越重要的作用。特别是随着近年人民生活水平不断提高&#xff0c;校园疫情信息管理系统给学校带来了更大的帮助。 由于当前疫情防控形势复杂&#xff…...

使用Python批量将飞书文档转为MD

说明&#xff1a;飞书是在线文档平台&#xff0c;本文介绍如何使用Python程序批量将飞书文档转为MD文档&#xff0c;并下载到本地&#xff1b; 复制地址 首先&#xff0c;把文档的URL都复制下来&#xff0c;这个需要一个一个点&#xff0c;并复制拷贝&#xff0c;但却是工作量…...

Nacos配置管理、Feign远程调用、Gateway服务网关

1.Nacos配置管理 1.1.将配置交给Nacos管理的步骤 1.在Nacos中添加配置 Data Id服务名称-环境名称.yaml eg&#xff1a;userservice-dev.yaml 2.引入nacos-config依赖 在user-service服务中&#xff0c;引入nacos-config的客户端依赖 <!--nacos配置管理依赖--> <dep…...

解决Spring Boot前后端分离开发模式中的跨域问题

在实际开发中&#xff0c;经常会遇到前端Vue应用与后端Spring Boot API接口存在跨域访问的问题。本篇博客将分享解决Spring Boot前端Vue跨域问题的实战经验&#xff0c;帮助开发者快速解决该问题。 一、跨域问题的原因 跨域问题是由于浏览器的同源策略引起的。同源策略限制了…...

常见前端面试之VUE面试题汇总五

13. assets 和 static 的区别 相同点&#xff1a; assets 和 static 两个都是存放静态资源文件。项目中所 需要的资源文件图片&#xff0c;字体图标&#xff0c;样式文件等都可以放在这两个文件 下&#xff0c;这是相同点 不相同点&#xff1a;assets 中存放的静态资源文件在…...

带着问题看SpringBoot

带着问题看SpringBoot 1、Spring容器具体是什么&#xff1f; 跟进run方法&#xff0c;context this.createApplicationContext()&#xff0c;得出容器是AnnotationConfigServletWebServerApplicationContext类。 SpringApplication.run(ServeroneApplication.class, args);…...

【Go 基础篇】Go语言匿名函数详解:灵活的函数表达式与闭包

介绍 在Go语言中&#xff0c;函数是一等公民&#xff0c;这意味着函数可以像其他类型的值一样被操作、传递和赋值。匿名函数是一种特殊的函数&#xff0c;它没有固定的函数名&#xff0c;可以在代码中被直接定义和使用。匿名函数在Go语言中具有重要的地位&#xff0c;它们常用…...

MobileNet、MobileNetV2和MobileNetV3创新点总结

当谈论MobileNet、MobileNetV2和MobileNetV3时&#xff0c;我们指的是一系列基于深度学习的轻量级神经网络架构&#xff0c;这些架构旨在在保持高度准确性的同时减少模型的计算和参数量。以下是它们各自的创新点的详细总结&#xff1a; MobileNet&#xff1a; 深度可分离卷积&…...

算法:数据转换处理2(云台显控)

#define DISPLAYFUNC #include"define.h" extern OS_EVENT *KEYMsg; uchar mBlank[21] = " " ; u c h a r s t r v g a [ ] = " 0.00 V "; uchar str_vga[] = "0.00V...

让大数据平台数据安全可见-行云管家

数字化经济在快速发展&#xff0c;大数据时代已经到来&#xff0c;大数据已经成为企业和政府决策的重要依据。然而大数据行业快速发展所带来的一系列安全问题也继续解决&#xff0c;例如数据安全更难保障&#xff0c;例如认证体系不完善等等。为此行云管家推出了大数据平台数据…...

微信小程序开发教学系列(3)- 页面设计与布局

3. 页面设计与布局 在微信小程序开发中&#xff0c;页面的设计和布局是非常重要的。一个好的页面设计可以提升用户体验&#xff0c;并使小程序更加吸引人。本章节将介绍如何设计和布局微信小程序的页面。 3.1 页面结构和样式的创建和设置 在创建微信小程序页面时&#xff0c…...

基于JSP+Servlet+mysql员工权限管理系统

基于JSPServletmysql员工权限管理系统 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 项目类型&#xff1a;Java web项目 项目名称&#xff1a;基于JSPServlet的员工权限管理系统[qxxt] 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 …...

Qt 自定义提示框 右下角冒泡

网页右下角上经常会出现一些提示性的信息&#xff0c;B/S有的东西&#xff0c;C/S当然也可以有&#xff0c;就像QQ的消息提示一样&#xff01; 实现一个类似的东西并不困难&#xff0c;只要想明白原理实现起来就很简单了&#xff01; 实现原理&#xff1a; &#xff08;1&#…...

js、PHP连接外卖小票机打印机方案(调用佳博、芯烨等)

前言&#xff1a; 目前开发需要用到电脑直接连接外卖小票机打印小票&#xff0c;查阅各种资料&#xff0c;使用 6612345浏览器 终于解决了这个问题。 效果&#xff1a; PHP、js直接连接小票机并且自动出票。 支持的小票机&#xff1a; 目前测试可以的有&#xff1a;电脑A4打印…...

window定时备份MySQL数据库,默认备份7天,一小时备份一次

echo off setlocalrem 在Windows中添加任务计划以执行批处理脚本&#xff0c;请按照以下步骤操作&#xff1a;rem 打开Windows的“任务计划程序”应用程序。你可以通过按下Win R键&#xff0c;在运行对话框中输入taskschd.msc&#xff0c;然后按回车键来打开它。rem 在任务计划…...

正则中常见的流派及其特性

目前正则表达式主要有两大流派&#xff08;Flavor&#xff09;&#xff1a;POSIX 流派与 PCRE 流派。 1、 POSIX 流派 POSIX 规范定义了正则表达式的两种标准&#xff1a; BRE 标准&#xff08;Basic Regular Expression 基本正则表达式&#xff09;&#xff1b;ERE 标准&am…...

.net6.0引用的dll放置单独的文件夹

.net6.0 采用原有的设置方法不起作用 <?xml version"1.0" encoding"utf-8" ?> <configuration><startup> <supportedRuntime version"v4.0" sku".NETFramework,Versionv4.8" /></startup><runtim…...

CMake:检测外部库---自定义find模块

CMake:检测外部库---自定义find模块 导言项目结构CMakeLists.txt附录 导言 上一篇&#xff0c;我们了解了CMake其中一种自定义检测外部库的方式&#xff0c;本篇将展示通过编写一个find模块来定位系统上的ZeroMQ库&#xff0c;以便能够在非Unix操作系统上检测该库。 项目结构…...

vue直接使用高德api

第一步&#xff1a;在index.html 引入 <script src"https://webapi.amap.com/maps?v2.0&key你的key"></script>第二步&#xff1a;在你需要地图的时候 放入 <template><div style"width: 200px; height: 200px"><div id&q…...

Setting

目录 1 Setting 1.1.1 getChildList 1.1.2 getGroupList 1.1.3 setListener setOnChildClickListenermSettingList.setOnChildClickListener(new OnChildClickListener() {onChildClick...

时序预测 | Matlab实现SO-CNN-BiGRU蛇群算法优化卷积双向门控循环单元时间序列预测

时序预测 | Matlab实现SO-CNN-BiGRU蛇群算法优化卷积双向门控循环单元时间序列预测 目录 时序预测 | Matlab实现SO-CNN-BiGRU蛇群算法优化卷积双向门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Matlab实现SO-CNN-BiGRU蛇群算法优化…...

论文浅尝 | KRACL-利用图上下文和对比学习的稀疏KG补全

笔记整理&#xff1a;李娟&#xff0c;浙江大学博士&#xff0c;研究方向为知识图谱表示学习 论文链接&#xff1a;https://arxiv.org/pdf/2208.07622.pdf 代码链接&#xff1a;https://github.com/TamSiuhin/KRACL 介绍 知识图谱&#xff08;KG&#xff09;通常是不完整的&…...

【C++】右值引用,移动语义,完美转发

目录 右值引用移动语义拷贝构造与移动构造 万能引用与完美转发 右值引用 左值&#xff1a;可以出现在赋值符号的左边和右边&#xff0c;左值可以取地址。 右值&#xff1a;右值可以出现在赋值符号右边&#xff0c;不能出现在左边&#xff0c;右值不能取地址。 左值/右值引用就…...

【AI】即使AI 时代,程序员也无需焦虑

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Python、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&…...

Django实现DRF数据API接口格式封装

通常在进行前后端分离开发的时候,前端Vue调用后端接口都需要一个状态信息以及数据结合起来的数据。 如果是没有经过加工的API接口访问的数据一般是这样的。 [{"id": 1, "type": "1", "start": "2023-08-24", "end&qu…...

[Go版]算法通关村第十三关白银——数字数学问题之数组实现加法、幂运算

目录 数组实现加法专题题目&#xff1a;数组实现整数加法思路分析&#xff1a;数组末尾开始&#xff0c;逐个元素1&#xff0c;10就进位&#xff0c;!10就退出复杂度&#xff1a;时间复杂度 O ( n ) O(n) O(n)、空间复杂度 O ( n ) O(n) O(n)Go代码 题目&#xff1a;字符串加法…...

【 OpenGauss源码学习 —— 列存储(Insert)】

列存储&#xff08;Insert&#xff09; 概述相关函数ExecInsertRelationData 结构体FormData_pg_class 结构体HeapInsertCStore函数InsertArg 结构体CStoreInsert 类CStoreInsert::InitInsertArg函数heap_deform_tuple 函数bulkload_rows 结构体append_one_tuple 函数bulkload_…...

Android 13.0 framework中实现默认长按电源键弹出关机对话框功能

1.前言 在13.0的系统定制化开发中,在12.0的系统之前默认的都是长按电源键弹出关机对话框,而在13以后 就改成音量+电源键弹出对话框,由于使用不方便,所以就改成默认长按弹出关机对话框功能 2.framework中实现默认长按电源键弹出关机对话框功能的核心类 frameworks/base/s…...

微信小程序,封装身高体重选择器组件

wxml代码&#xff1a; // 微信小程序的插值语法不支持直接使用Math <wxs src"./ruler.wxs" module"math"></wxs> <view class"ruler-container"><scroll-view scroll-left"{{scrollLeft}}" enhanced"{{tru…...

深度学习调参技巧

写完代码—> 小数据上降loss无nan—> 大数据没爆卡速度可以—> 实验log完好可视化loss稳步下降—>回头看实验结果 写完代码后&#xff0c;不要只是在小数据上降loss无nan&#xff0c;还要检查一下模型的输出是否符合预期&#xff0c;比如是否有明显的偏差或者异常值…...

图论基础和表示(Java 实例代码)

目录 图论基础和表示 一、概念及其介绍 二、适用说明 三、图的表达形式 Java 实例代码 src/runoob/graph/DenseGraph.java 文件代码&#xff1a; src/runoob/graph/SparseGraph.java 文件代码&#xff1a; 图论基础和表示 一、概念及其介绍 图论(Graph Theory)是离散数…...

各种数据库查询报错问题

文章目录 前言一、约束条件是自增&#xff0c;不能直接添加数据二、使用步骤1.引入库2.读入数据 总结 前言 记录常见的数据库使用问题&#xff0c;以及对应解决思路 一、约束条件是自增&#xff0c;不能直接添加数据 消息 8101&#xff0c;级别 16&#xff0c;状态 1&#xf…...

人效九宫格城市沙龙暨《人效九宫格白皮书》发布会 —上海站,圆满结束

8月11日&#xff0c;在上海龙之梦万丽酒店&#xff0c;由盖雅工场主办的人效九宫格城市沙龙暨《人效九宫格白皮书》发布会 —上海站&#xff0c;圆满结束。 近百位来自多个行业的企业管理者及人力资源从业者汇聚一堂&#xff0c;共同探讨企业如何将盈利模式从数量增长转为质量增…...

【C语言】文件操作 -- 详解

一、什么是文件 磁盘上的文件是文件。 1、为什么要使用文件 举个例子&#xff0c;当我们想实现一个 “通讯录” 程序时&#xff0c;在通讯录中新建联系人、删除联系人等一系列操作&#xff0c;此时的数据存储于内存中&#xff0c;程序退出后所有数据都会随之消失。为了让通讯录…...

飞天使-k8s基础组件分析-持久化存储

文章目录 emptyDirhostpathpv和pvc介绍nfs作为静态pv案例nfs作为动态pv案例使用本地文件夹作为pv改变默认存储类及回收策略参考文档 emptyDir 重启文件还有&#xff0c;但是如果杀了进程&#xff0c;则会丢失文件 创建pod # kubectl apply –f redis.yaml校验pod是否处于运行&…...

python连接PostgreSQL 数据库

执行如下命令安装 pip3 install psycopg2 python代码 Author: tkhywang 2810248865qq.com Date: 2023-08-21 11:42:17 LastEditors: tkhywang 2810248865qq.com LastEditTime: 2023-08-21 11:51:56 FilePath: \PythonProject02\PostgreSQL 数据库.py Description: 这是默认设置…...

数字图像处理—— Lab、YCbCr、HSV、RGB之间互转

Lab “Lab” 图像格式通常指的是 CIELAB 色彩空间&#xff0c;也称为 Lab 色彩空间。它是一种用于描述人类视觉感知的颜色的设备无关色彩空间&#xff0c;与常见的 RGB 和 CMYK 色彩空间不同。CIELAB 由国际照明委员会&#xff08;CIE&#xff09;于1976年定义&#xff0c;用于…...