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

算法导论第十九章 并行算法:解锁计算新维度

第十九章 并行算法:解锁计算新维度

“并行计算不是未来,而是现在。” —— David Patterson

在单核性能增长放缓的时代,并行算法成为突破计算极限的关键。本章将带你探索多核处理器、分布式系统和GPU加速的奇妙世界,揭示如何通过协同计算解决传统串行算法难以企及的大规模问题。

19.1 并行计算革命

19.1.1 从单核到并行的演变

摩尔定律的变迁

  • 1986-2004:时钟频率每年增长40%
  • 2004至今:核心数量每18-24个月翻倍
单核时代
频率提升
功耗墙
多核时代
众核架构
异构计算

19.1.2 并行计算模型对比

模型代表技术通信方式适用场景
共享内存OpenMP内存共享单机多核
消息传递MPI网络通信超级计算机
SIMDGPU数据并行图形/科学计算
数据流TensorFlow数据依赖机器学习

19.2 并行算法设计模式

19.2.1 分治并行模式

问题
分解
子问题1
子问题2
并行解决
并行解决
合并
结果

19.2.2 流水线并行模式

// 图像处理流水线示例
#pragma omp parallel sections
{#pragma omp sectionstage1_process(image);  // 阶段1:去噪#pragma omp sectionstage2_process(image);  // 阶段2:边缘检测#pragma omp sectionstage3_process(image);  // 阶段3:特征提取
}

19.2.3 MapReduce模式

// 词频统计MapReduce伪代码
void map(string document) {for each word in document:emit(word, 1);
}void reduce(string word, list<int> counts) {int sum = 0;for each count in counts:sum += count;emit(word, sum);
}

19.3 共享内存并行:OpenMP

19.3.1 OpenMP核心指令

#include <omp.h>
#include <stdio.h>int main() {int n = 1000000;double sum = 0.0;// 并行区域#pragma omp parallel for reduction(+:sum)for (int i = 0; i < n; i++) {double term = (i % 2 == 0) ? 1.0 : -1.0;term /= 2 * i + 1;sum += term;}double pi = 4 * sum;printf("π ≈ %.15f\n", pi);return 0;
}

19.3.2 性能优化技巧

  1. 循环调度策略

    • schedule(static):均匀划分
    • schedule(dynamic):动态分配
    • schedule(guided):大块优先
  2. 数据局部性优化

// 缓存友好访问
#pragma omp parallel for collapse(2)
for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {// 连续内存访问A[i][j] = B[i][j] * C[j][i]; }
}

19.4 分布式并行:MPI

19.4.1 MPI通信模式

点对点通信
集体通信
同步栅栏
进程0
进程1
进程2
所有进程
进程3
所有进程

19.4.2 矩阵乘法MPI实现

#include <mpi.h>
#include <stdio.h>#define N 1024  // 矩阵大小int main(int argc, char** argv) {int rank, size;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &rank);MPI_Comm_size(MPI_COMM_WORLD, &size);// 计算每个进程负责的行块int rows_per_proc = N / size;double *A_local = malloc(rows_per_proc * N * sizeof(double));double *B = malloc(N * N * sizeof(double));double *C_local = malloc(rows_per_proc * N * sizeof(double));// 主进程初始化矩阵if (rank == 0) {// 初始化A和B矩阵...}// 分发数据MPI_Scatter(A, rows_per_proc * N, MPI_DOUBLE, A_local, rows_per_proc * N, MPI_DOUBLE, 0, MPI_COMM_WORLD);MPI_Bcast(B, N * N, MPI_DOUBLE, 0, MPI_COMM_WORLD);// 本地矩阵乘法for (int i = 0; i < rows_per_proc; i++) {for (int j = 0; j < N; j++) {C_local[i * N + j] = 0;for (int k = 0; k < N; k++) {C_local[i * N + j] += A_local[i * N + k] * B[k * N + j];}}}// 收集结果MPI_Gather(C_local, rows_per_proc * N, MPI_DOUBLE, C, rows_per_proc * N, MPI_DOUBLE, 0, MPI_COMM_WORLD);// 清理资源free(A_local);free(B);free(C_local);MPI_Finalize();return 0;
}

19.4.3 MPI通信优化

通信模式函数适用场景
点对点MPI_Send/Recv不规则数据交换
集合通信MPI_Bcast广播数据
MPI_Reduce全局归约
MPI_Alltoall全交换
非阻塞通信MPI_Isend/Irecv重叠计算和通信

19.5 GPU并行计算:CUDA

19.5.1 CUDA编程模型

数据传输
主机Host
设备Device
网格Grid
线程块Block
线程Thread

19.5.2 CUDA向量加法

#include <stdio.h>
#include <cuda_runtime.h>// CUDA核函数
__global__ void vectorAdd(int *a, int *b, int *c, int n) {int tid = blockIdx.x * blockDim.x + threadIdx.x;if (tid < n) {c[tid] = a[tid] + b[tid];}
}int main() {int n = 1 << 20; // 1M元素size_t size = n * sizeof(int);// 主机内存int *h_a = malloc(size);int *h_b = malloc(size);int *h_c = malloc(size);// 设备内存int *d_a, *d_b, *d_c;cudaMalloc(&d_a, size);cudaMalloc(&d_b, size);cudaMalloc(&d_c, size);// 初始化数据for (int i = 0; i < n; i++) {h_a[i] = i;h_b[i] = i * 2;}// 数据复制到设备cudaMemcpy(d_a, h_a, size, cudaMemcpyHostToDevice);cudaMemcpy(d_b, h_b, size, cudaMemcpyHostToDevice);// 启动核函数int threadsPerBlock = 256;int blocksPerGrid = (n + threadsPerBlock - 1) / threadsPerBlock;vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_a, d_b, d_c, n);// 结果复制回主机cudaMemcpy(h_c, d_c, size, cudaMemcpyDeviceToHost);// 验证结果for (int i = 0; i < n; i++) {if (h_c[i] != h_a[i] + h_b[i]) {printf("Error at index %d\n", i);break;}}// 清理资源free(h_a); free(h_b); free(h_c);cudaFree(d_a); cudaFree(d_b); cudaFree(d_c);return 0;
}

19.5.3 CUDA性能优化

  1. 内存层次优化

    • 全局内存 → 共享内存 → 寄存器
    • 合并内存访问
  2. 执行配置优化

dim3 blocks(256, 1, 1);
dim3 grid((width+255)/256, (height+63)/64, 1);
kernel<<<grid, blocks>>>(...);
  1. 异步执行
cudaMemcpyAsync(d_data, h_data, size, cudaMemcpyHostToDevice, stream);
kernel<<<grid, block, 0, stream>>>(...);
cudaMemcpyAsync(h_result, d_result, size, cudaMemcpyDeviceToHost, stream);

19.6 并行图算法

19.6.1 并行BFS实现

void parallel_bfs(Graph *g, int start) {int *visited = calloc(g->nvertices, sizeof(int));int *current_frontier = malloc(g->nvertices * sizeof(int));int *next_frontier = malloc(g->nvertices * sizeof(int));int current_size = 1;current_frontier[0] = start;visited[start] = 1;while (current_size > 0) {int next_size = 0;#pragma omp parallel for schedule(dynamic, 64)for (int i = 0; i < current_size; i++) {int node = current_frontier[i];for (int j = 0; j < g->degree[node]; j++) {int neighbor = g->edges[node][j];if (!__sync_fetch_and_or(&visited[neighbor], 1)) {int pos;#pragma omp atomic capturepos = next_size++;next_frontier[pos] = neighbor;}}}// 交换边界int *temp = current_frontier;current_frontier = next_frontier;next_frontier = temp;current_size = next_size;}free(visited);free(current_frontier);free(next_frontier);
}

19.6.2 并行PageRank算法

void parallel_pagerank(Graph *g, double damping, double epsilon) {int n = g->nvertices;double *rank = malloc(n * sizeof(double));double *new_rank = malloc(n * sizeof(double));// 初始化#pragma omp parallel forfor (int i = 0; i < n; i++) {rank[i] = 1.0 / n;}double diff;int iter = 0;do {diff = 0;#pragma omp parallel forfor (int i = 0; i < n; i++) {new_rank[i] = (1 - damping) / n;}// 传播排名#pragma omp parallel for reduction(+:diff)for (int i = 0; i < n; i++) {if (g->degree[i] > 0) {double contribution = damping * rank[i] / g->degree[i];for (int j = 0; j < g->degree[i]; j++) {int neighbor = g->edges[i][j];#pragma omp atomicnew_rank[neighbor] += contribution;}}}// 计算差异#pragma omp parallel for reduction(+:diff)for (int i = 0; i < n; i++) {diff += fabs(new_rank[i] - rank[i]);rank[i] = new_rank[i];}printf("迭代 %d, 差异: %f\n", ++iter, diff);} while (diff > epsilon);free(rank);free(new_rank);
}

19.7 并行排序算法

19.7.1 并行快速排序

void parallel_quicksort(int *arr, int left, int right) {if (right - left < 1000) {qsort(arr + left, right - left + 1, sizeof(int), compare);return;}int pivot = partition(arr, left, right);#pragma omp task shared(arr)parallel_quicksort(arr, left, pivot - 1);#pragma omp task shared(arr)parallel_quicksort(arr, pivot + 1, right);#pragma omp taskwait
}// 调用方式
#pragma omp parallel
{#pragma omp singleparallel_quicksort(arr, 0, n-1);
}

19.7.2 并行归并排序

void parallel_mergesort(int *arr, int l, int r) {if (l < r) {int m = l + (r - l) / 2;#pragma omp task if(r-l > 100000)parallel_mergesort(arr, l, m);#pragma omp task if(r-l > 100000)parallel_mergesort(arr, m+1, r);#pragma omp taskwaitmerge(arr, l, m, r);}
}

19.7.3 排序算法性能对比

算法时间复杂度并行效率适用数据规模
快速排序O(n log n)中小规模
归并排序O(n log n)大规模
基数排序O(nk)中等整数数据
样本排序O(n log n)超大规模

19.8 并行性能分析

19.8.1 加速比定律

  1. Amdahl定律
    S = 1 ( 1 − P ) + P N S = \frac{1}{(1 - P) + \frac{P}{N}} S=(1P)+NP1

  2. Gustafson定律
    S = N + ( 1 − N ) ( 1 − P ) S = N + (1 - N)(1 - P) S=N+(1N)(1P)

问题规模
串行比例P
Amdahl定律
并行比例1-P
Gustafson定律

19.8.2 性能分析工具

  1. 时间线分析
$ nsys profile ./parallel_program
  1. 性能计数器
#include <papi.h>int events[2] = {PAPI_TOT_CYC, PAPI_TOT_INS};
long long values[2];PAPI_start_counters(events, 2);// 并行区域...PAPI_stop_counters(values, 2);
double cpi = (double)values[0] / values[1];

19.9 实际应用案例

19.9.1 气候模拟(MPI)

void climate_simulation() {// 初始化MPIMPI_Init(...);// 划分全球网格int local_rows = global_rows / size;Grid *local_grid = create_grid(local_rows, COLS);while (time < MAX_TIME) {// 边界交换exchange_boundaries(local_grid);// 本地物理计算compute_physics(local_grid);// 全局同步MPI_Barrier(MPI_COMM_WORLD);time += TIME_STEP;}MPI_Finalize();
}

19.9.2 深度学习训练(GPU)

void train_neural_network() {// 初始化模型和数据Model *model = create_model();DataBatch *batch = next_batch();while (!converged) {// 前向传播forward_propagate<<<blocks, threads>>>(model, batch);// 损失计算compute_loss<<<blocks, threads>>>(model, batch);// 反向传播backward_propagate<<<blocks, threads>>>(model, batch);// 参数更新update_parameters<<<blocks, threads>>>(model);batch = next_batch();}
}

19.9.3 实时渲染(多核+GPU)

void render_frame() {// CPU任务:场景管理#pragma omp parallel sections{#pragma omp sectionupdate_physics();#pragma omp sectionprocess_ai();#pragma omp sectionhandle_input();}// GPU任务:渲染render_scene<<<grid, block>>>(scene);// 显示结果display_frame();
}

19.10 并行计算挑战与未来

19.10.1 当前挑战

  1. 负载均衡:动态任务分配
  2. 通信开销:减少数据传输
  3. 并发错误:数据竞争、死锁
  4. 编程复杂性:学习曲线陡峭

19.10.2 未来趋势

  1. 异构计算:CPU+GPU+FPGA协同
  2. 量子并行:量子算法加速
  3. 神经形态计算:模拟大脑并行处理
  4. 自动并行化:编译器智能优化
并行计算未来
更多核心
更智能运行时
新型硬件架构
自动并行化

19.11 总结与下一章预告

并行算法将计算从线性推向多维空间:

  1. 模型多样:共享内存、消息传递、SIMD架构
  2. 框架成熟:OpenMP、MPI、CUDA各司其职
  3. 算法丰富:并行排序、图算法、科学计算
  4. 应用广泛:从科学模拟到深度学习

下一章预告:近似算法

第二十章我们将探索近似算法的智慧:

  • NP难问题的实用解决方案
  • 近似比与性能保证分析
  • 经典问题:旅行商问题、顶点覆盖、背包问题
  • 随机化近似方法
  • 近似方案:PTAS与FPTAS

当精确解难以获得时,近似算法提供了在可接受时间内获得高质量解的优雅途径,平衡计算效率与结果质量。

并行计算不仅是技术演进的结果,更是解决人类面临复杂问题的关键。从天气预报到基因测序,从深度学习到宇宙模拟,并行算法正在扩展人类认知的边界,开启计算科学的新纪元。

相关文章:

算法导论第十九章 并行算法:解锁计算新维度

第十九章 并行算法&#xff1a;解锁计算新维度 “并行计算不是未来&#xff0c;而是现在。” —— David Patterson 在单核性能增长放缓的时代&#xff0c;并行算法成为突破计算极限的关键。本章将带你探索多核处理器、分布式系统和GPU加速的奇妙世界&#xff0c;揭示如何通过协…...

Python 数据分析与可视化 Day 1 - Pandas 数据分析基础入门

&#x1f3af; 今日目标 理解 Pandas 的作用和核心概念学会创建 Series 和 DataFrame掌握基本数据读取&#xff08;CSV&#xff09;与常用查看方法 &#x1f9f0; 1. 什么是 Pandas&#xff1f; Pandas 是基于 NumPy 的强大数据分析库&#xff0c;提供了灵活的表格数据结构 Da…...

【数字人开发】Unity+百度智能云平台实现长短文本个性化语音生成功能

一、创建自己的应用 百度智能云控制台网址&#xff1a;https://console.bce.baidu.com/ 1、创建应用 2、获取APIKey和SecretKey 3、Api调试 调试网址&#xff1a;https://console.bce.baidu.com/support/?timestamp1750317430400#/api?productAI&project%E8%AF%AD%E9%…...

(哈希)128. 最长连续序列

题目 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&#xff…...

MFC中使用CRichEditCtrl控件让文本框中的内容部分加粗

MFC中文本框控件的内容&#xff0c;设置好字体格式后&#xff0c;只能单一的显示&#xff0c;如果相对文本框的内容部分加粗&#xff0c;或者部分加颜色、链接等都无法实现&#xff0c;但MFC中提供了CRichEditCtrl控件&#xff0c;就很方便的实现文本框中部分内容需要特殊处理的…...

Redis 的优势有哪些,它是CP 还是 AP?CAP 理论又是什么?

Redis的核心优势 Redis作为当今最流行的内存数据库之一&#xff0c;具有以下显著优势&#xff1a; 1. 卓越的性能表现 内存存储&#xff1a;数据主要存储在内存中&#xff0c;读写速度极快&#xff08;10万 QPS&#xff09;单线程架构&#xff1a;避免多线程竞争&#xff0c…...

flink的多种部署模式

## 部署模式和运行模式 ### 部署模式 - 本地local - 单机无需分布式资源管理 - 集群 - 独立集群standalone - 需要flink自身的任务管理工具 - jobmanager接收和调度任务 - taskmanager执行 - on其他资源管理工具yarn/k8s …...

SQL分片工具类

SQL分片工具类(SqlShardingUtil)提供数据库查询的智能分片功能&#xff0c;支持数字和字符串两种字段类型的分片策略。对于数字字段&#xff0c;可以指定分片数量均匀划分数值区间&#xff1b;对于字符串字段&#xff0c;则按照ASCII字符范围自动划分。工具类确保分片后的SQL语…...

死锁相关知识

死锁是什么 死锁&#xff08;Deadlock&#xff09;是指两个或多个进程&#xff08;或线程&#xff09;在执行过程中&#xff0c;因为互相等待对方释放资源&#xff0c;导致永远无法继续执行的状态。 ✅ 死锁的形成条件&#xff08;必须同时满足以下四个&#xff09;&#xff1…...

oscp靶机练习PG Reconstruction

枚举阶段 nmap -A -T4 -p- -Pn -n 192.168.217.103 发现ftp&#xff0c;进行连接枚举 都下载到本地 这里提示我们两点&#xff0c;可以看看pcap文件&#xff0c;还有就是可能有密码遗留还没有删除。 使用下面命令进行过滤筛选流量包&#xff0c;查看与密码相关 http.reque…...

写题。贪心题组

一、 解题思路&#xff1a;主要还是写出val / m&#xff0c;按这个排序&#xff0c;就行了 #include<bits/stdc.h> #define endl "\n" #define ll long long #define pii pair<int,int> using namespace std;struct doro {int m, val;double cmp; } arr…...

UE官方文档学习 TAarry 查询

这个很简单经常用。 二.GetData() . GetData()&#xff0c;像C里拿到数组首地址一样。它不具有越界保护机制&#xff0c;StrArr拥有越界保护机制。这个地址在数组不做改变&#xff0c;如扩容等有用。 void AWXArrayActor::WXFindArray() {TArray<FString> StrArr { &q…...

使用Haproxy搭建Web群集

LVS负载均衡群集 Haproxy介绍http请求负载均衡常用调度算法常见的web群集调度器 示例操作安装httpd&#xff08;两台网站服务器操作一致&#xff09;编译安装haproxyhaproxy服务器配置(1)建立haproxy的配置文件(2)修改haproxy.cfg配置文件 测试haproxy的日志(1)修改 haproxy 配…...

Linux 基础命令:`ls`、`cd`、`du` 快速入门

在 Linux 系统中&#xff0c;ls、cd 和 du 是日常操作中最常用的三个命令。掌握它们能大幅提升文件管理效率。 1. ls&#xff1a;查看目录内容 用途&#xff1a;列出当前或指定目录下的文件和子目录。 常用命令&#xff1a; ls -l # 详细列表&#xff08;权限、大…...

[论文阅读] 人工智能 + 软件工程 | USEagent:迈向统一的AI软件工程师

论文信息 article{applis2025unified,title{Unified Software Engineering agent as AI Software Engineer},author{Applis, Leonhard and Jiang, Nan and Zhang, Yuntong and Tan, Lin and Liang, Shanchao and Roychoudhury, Abhik},journal{arXiv preprint arXiv:2506.1468…...

微信小程序传参过来了,但是数据没有获取到

使用本方法前&#xff0c;已经采用encodeURIComponent把拼接的参数编码之后&#xff0c;拼接在链接上&#xff0c;在接受的页面的onLoad生命周期&#xff0c;接收到参数之后&#xff0c;采用decodeURIComponent进行解码的操作&#xff0c;如果这个也不行&#xff0c;不是说不行…...

微信小程序form表单手机号正则检验pattern失效

好奇怪啊&#xff0c;h5页面校验没问题&#xff0c;在微信小程序模拟器以及真机运行都失效&#xff0c;排查半天&#xff0c;记录一下 PS&#xff1a;身份证号校验也没问题&#xff0c;就手机号校验有问题&#xff0c;奇奇怪怪的 之前的写法&#xff08;在小程序上不生效&…...

repo 工具

repo 是 Google 为管理多个 Git 仓库而开发的工具&#xff0c;主要用于 Android 开源项目&#xff08;AOSP&#xff09;等大型项目。它通过清单文件&#xff08;manifest.xml&#xff09;统一管理多个 Git 仓库的依赖关系。以下是核心用法和常见命令&#xff1a; 一、安装 repo…...

Python实例题:基于 TensorFlow 的图像识别与分类系统

目录 Python实例题 题目 问题描述 解题思路 关键代码框架 难点分析 扩展方向 Python实例题 题目 基于 TensorFlow 的图像识别与分类系统 问题描述 开发一个基于 TensorFlow 的图像识别与分类系统&#xff0c;包含以下功能&#xff1a; 图像分类模型&#xff1a;基于…...

Windows 10开始菜单优化方案,如何实现Win7风格开始菜单的还原

今天阿灿给大家安利个好东西 Start10这软件能让Win10的开始菜单变回Win7那种经典样式&#xff0c;用起来特别顺手。不仅能改开始菜单外观&#xff0c;还能调整任务栏布局&#xff0c;想怎么设置都行。 我用它主要就图两点&#xff1a; 1. 找回Win7那种简洁好用的开始菜单 2.…...

Kafka性能压测报告撰写

在大数据生态体系中&#xff0c;Kafka以其卓越的高吞吐、低延迟特性&#xff0c;成为消息队列领域的中流砥柱。然而&#xff0c;随着业务规模不断扩张&#xff0c;数据流量日益激增&#xff0c;Kafka的性能表现直接关乎业务系统的稳定运行与效率提升。通过科学严谨的性能压测&a…...

IP 地理库的使用指南:从基础应用到深度实践​

P 地理库的使用指南&#xff1a;从基础应用到深度实践​ ​ 在数字化时代&#xff0c;IP 地址如同网络世界里的 “门牌号码”&#xff0c;而 IP 地理库则是解读这些号码背后秘密的 “解码器”。它不仅能定位 IP 对应的地理位置&#xff0c;还能挖掘出丰富的网络属性信息。接下来…...

C#的泛型和匿名类型

一、C#的泛型简介 泛型是一种允许你延迟编写类或方法中的数据类型规范&#xff0c;直到你在实际使用时才替换为具体的数据类型【简单的说&#xff1a;泛型就是允许我们编写能够适用于任何数据类型的代码&#xff0c;而无需为每种特定类型重写相同的代码】(T是类型参数&#xff…...

ABP VNext + MongoDB 数据存储:多模型支持与 NoSQL 扩展

&#x1f680; ABP VNext MongoDB 数据存储&#xff1a;多模型支持与 NoSQL 扩展&#xff08;生产级实践&#xff09; 目录 &#x1f680; ABP VNext MongoDB 数据存储&#xff1a;多模型支持与 NoSQL 扩展&#xff08;生产级实践&#xff09;&#x1f3af; 引言&#x1f9f0…...

JETBRAINS IDE 开发环境自定义设置快捷键

Date: 2025-06-18 20:39:52 author: lijianzhan JetBrains简介 让它发生。 用代码。 在JetBrains&#xff0c;代码是我们的激情所在。自成立以来&#xff0c;我们一直致力于打造世界上最强大、最有效的开发工具。 1.JETBRAINS官网&#xff0c;可以在官网下载代码编辑器 2.进入…...

JAVA——泛型

泛型&#xff08;Generics&#xff09;是Java语言在JDK 5.0版本中引入的一种强大特性&#xff0c;用于在编译时提供更强的类型检查和类型安全。它允许程序员在定义类、接口和方法时使用类型参数&#xff08;Type Parameters&#xff09;&#xff0c;从而实现类型参数化。通过泛…...

攻防演练:1.木马后门文件演练

为了防止 Linux 服务器上传木马后门文件&#xff0c;可以编写一个脚本&#xff0c;定期检查系统中的可疑文件、进程和权限。以下是一个示例脚本&#xff0c;用于检查常见的后门文件、异常进程和权限问题。 脚本功能 检查常见后门文件路径。检查异常 SUID/SGID 文件。检查异常进…...

c++ STL---vector使用

本文对STL---中的vector的使用是参考网站 vector - C Reference 的内容&#xff0c;该网站是外文的哦&#xff0c;大家可以尝试打开看看更深刻的理解。本文是抽取其中常使用&#xff0c;然后加上自己的是理解哦。 前言 vector其实是顺序表类模板的封装啊&#xff01; 数据结构…...

windows标题栏显示奇怪的蓝色,怎么解决

背景 如下&#xff0c;非常奇怪&#xff0c;如果窗口是active状态就是蓝色的&#xff0c;为什么&#xff1f; 如果你遇到上述问题&#xff0c;可以这么解决&#xff1a; 右键点击桌面&#xff0c;选择 “个性化”&#xff0c; 滚动到下面&#xff0c;看到 “标题栏和窗口边…...

Kafka存储设计深度剖析:日志、索引与文件管理的底层奥秘

引言 在分布式消息系统领域&#xff0c;Kafka凭借卓越的性能与高可靠性占据重要地位&#xff0c;而这一切都离不开其精妙的存储设计。从消息的持久化存储到高效检索&#xff0c;从日志分段管理到数据清理策略&#xff0c;Kafka的存储架构设计巧妙&#xff0c;能够支撑海量消息…...

将多个Excel合并到一个Excel中的方法

今天遇到这么一个问题&#xff0c;需要将多个Excel表格中的数据汇总表&#xff0c;合并在一个Excel中&#xff0c;并且显示一致。 因此编写了以下代码来解决这个问题&#xff0c; 1.在Excel中按AltF11&#xff0c;快速调出命令控制台 2.工具栏选择插入——模块——将以下脚本…...

Debian配置Redis主从、哨兵

前言 Redis的下载安装可参考Centos安装配置Redis6.x&#xff0c;Centos和Debian的步骤基本类似&#xff0c;或自行在网上搜索相关资料 注意&#xff1a;远程连接需放开相应端口 主从 搭建一个一主二从的主从模式 处理conf文件 #进入redis所在目录 cd /tools/redis/redis6 …...

OpenSSL引擎 + PKCS11 + SoftHSM2认证

OpenSSL引擎 PKCS11 SoftHSM2 前言&#xff1a;金融级安全的基石 在金融、军工等高安全领域&#xff0c;硬件安全模块&#xff08;HSM&#xff09; 是保护加密密钥的黄金标准。本文将深度剖析HSM核心组件libpkcs11.so的工作原理&#xff0c;并手把手教你搭建基于SoftHSM2的…...

flex布局 项目属性

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>flex布局 项目属性</title> <link href"css/k.css" rel"stylesheet" /> </head> <bod…...

流水表延迟处理方案设计

**### 流水表延迟处理方案设计 针对你的场景&#xff08;流水表插入记录&#xff0c;当type4时需要1秒后处理&#xff09;&#xff0c;结合现有技术栈&#xff08;JDK8、MySQL、定时任务、Redis、RabbitMQ&#xff09;&#xff0c;我推荐以下几种可行方案&#xff1a; 一、方…...

密室出逃消消乐小游戏微信流量主小程序开源

这个密室出逃消消乐小游戏采用了微信小程序的标准目录结构&#xff0c;包含以下核心功能&#xff1a; 游戏界面&#xff1a;6x6 的网格布局&#xff0c;随机生成不同类型的物品 游戏逻辑&#xff1a;交换相邻物品&#xff0c;消除三个或以上相同类型的物品 计分系统&#xff1a…...

Docker 日志

Docker 日志是排查容器故障、监控运行状态的重要工具。下面从 日志查看命令、详解字段、日志驱动、最佳实践 四个方面给你详细解析。 一、最常用日志命令 1. 查看容器日志&#xff08;默认 stdout、stderr&#xff09; docker logs <container_name|container_id>2. 实…...

嵌入Linux快速入门第3篇

01_嵌入式Linux开发环境介绍 在Windows环境下的操作&#xff1a; 02_配置VMware使用双网卡之NAT网卡 虚拟机内部有两个网卡&#xff0c;一个是NAT网卡&#xff0c;另外一个是桥接网卡。NAT网卡用来保证Ubuntu可以上网&#xff0c;桥接网卡用来保证Ubuntu可以和开发板进行数据…...

详解鸿蒙Next仓颉开发语言中的全屏模式

大家好&#xff0c;今天跟大家分享一下仓颉开发语言中的全屏模式。 和ArkTS一样&#xff0c;仓颉的新建项目默认是非全屏模式的&#xff0c;如果你的应用颜色比较丰富&#xff0c;就会发现屏幕上方和底部的留白&#xff0c;这是应用自动避让了屏幕上方摄像头区域和底部的导航条…...

Oracle/MySQL/SqlServer/PostgreSQL等数据库的数据类型映射以及各版本数据类型情况说明

1 引言 近期工作聚焦于跨数据库系统的数据类型兼容性研究&#xff0c;旨在解决多源异构数据迁移、系统集成及版本升级中的类型映射难题。具体任务包括&#xff1a;1&#xff09;建立主流数据库&#xff08;如MySQL、Oracle、PostgreSQL、SQL Server等&#xff09;的数据类型映射…...

新生活的开启:从 Trae AI 离开后的三个月

很久没有写文章了&#xff0c;想借着入职新公司一个月的机会&#xff0c;和大家唠唠嗑。 离职 今年2月份我从字节离职了&#xff0c;结束了四年的经历&#xff0c;当时离开的核心原因是觉得加班时间太长了&#xff0c;平均每天都要工作15&#xff0c;16个小时&#xff0c;周末…...

背包问题概论(01背包,完全背包,多重背包)DP

背包问题概论&#xff08;01背包&#xff0c;完全背包&#xff0c;多重背包&#xff09;DP 背包问题一种经典的组合优化问题&#xff0c;主要用于在有限的容量下选择物品以最大化总价值。它分为几种类型&#xff1a;   ①&#xff1a;0/1背包问题&#xff1a;每种物品只能选择…...

攻克SQL审核“最后堡垒”!PawSQL首发T-SQL存储过程深度优化引擎

为什么存储过程审核那么难&#xff1f; 存储过程将数据操作逻辑固化在数据库层&#xff0c;一次编译、多次执行&#xff0c;既能大幅提升性能&#xff0c;也能通过权限隔离增强安全。然而&#xff0c;正因其逻辑复杂、分支众多&#xff0c;存储过程内部的 SQL 审核与优化常常成…...

Stable Diffusion 实战-手机壁纸制作 第二篇:优化那些“崩脸”和“马赛克”问题,让图像更加完美!

欢迎回来!在《StableDiffusion实战-手机壁纸制作》系列的第一篇中,我们成功完成了基础操作,制作出了令人炫目的手机壁纸。 今天,我们将进入一个更高阶的领域——优化处理。因为谁不想让生成的艺术品更完美呢?尤其是避免“崩脸”和“马赛克”这种让人抓狂的问题! 创作的路…...

Kafka消费者客户端源码深度解析:从架构到核心流程

在Kafka生态系统中&#xff0c;消费者客户端作为数据消费的入口&#xff0c;其设计与实现直接影响数据处理的效率和可靠性。本文将深入Kafka消费者客户端源码&#xff0c;通过核心组件解析、流程拆解与源码分析&#xff0c;揭示其高性能消费背后的技术奥秘&#xff0c;并辅以架…...

Linux进程间通信:从入门到精通(2)

嘿&#xff0c;小伙伴&#xff01;今天我们来聊聊Linux系统中一个超级重要的话题——进程间通信&#xff08;IPC&#xff09;。看到"进程间通信"这个词&#xff0c;别急着打哈欠&#xff0c;这可是Linux内核中的"社交达人"&#xff0c;让进程们能够愉快地交…...

从源码到生产:Apache 2.4.57 自动化安装实战指南(附脚本)

引言&#xff1a;为何选择源码安装 Apache&#xff1f; 在服务器运维场景中&#xff0c;源码编译安装 Apache HTTP Server 是实现精细化配置的重要方式。相比包管理器安装&#xff0c;源码安装可自定义模块组合、适配特定依赖环境&#xff0c;并精确控制版本。本文将通过自动化…...

CMake实践:指定gcc版本编译和交叉编译

目录 1.指定gcc版本编译 1.1.通过CMake参数来实现 1.2.使用 RPATH/RUNPATH 直接指定库路径 1.3.使用符号链接和 LD_LIBRARY_PATH 1.4.使用 wrapper 脚本封装 LD_LIBRARY_PATH 2.交叉编译 2.1.基本用法 2.2.工具链文件关键配置 2.3.多平台工具链示例 2.4.注意事项 2.…...

【MySQL基础】MySQL内置函数全面解析:提升你的数据库操作效率

MySQL学习&#xff1a; https://blog.csdn.net/2301_80220607/category_12971838.html?spm1001.2014.3001.5482 前言&#xff1a; MySQL提供了丰富的内置函数来帮助开发者高效地处理数据。这些函数覆盖了字符串操作、数值计算、日期时间处理、流程控制等多个方面。本文将全面…...

OpenCV CUDA模块设备层-----在GPU上计算两个uchar1类型像素值的反正切(arctangent)比值函数atan2()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对输入的两个 uchar1 像素值 a 和 b&#xff0c;先分别归一化到 [0.0, 1.0] 浮点区间&#xff0c;然后计算它们的 四象限反正切函数。 函数原型…...