RTX3060 FP64测试与猜想

news2024/9/21 4:32:30

RTX3060 FP64测试与猜想

  • 一.小结
  • 二.查看FP64的峰值性能
  • 三.打满FP64、FP32的利用率,对比差异
  • 四.进一步证明pipe_fp64_cycles_active并不是2个fp64 core的metrics

RTX3060 FP64测试与猜想

一.小结

  • RTX3060 compute capability为8.6,每个SM有2个FP64 core。每个cycle可输出2个fp64的结果

  • RTX3060 有4个subcore,这2个core怎么给4个sub_core分呢

  • 执行FP64 DADD指令时,MIO PQ利用率超20%(FADD指令不存在该现象),且fp64 pipe的利用率最多为84%

  • 每个smsp 执行一条DADD warp指令 pipe_fp64_cycles_active 增加16个cycle,4个smsp一起运行一条DADD warp指令仍是16个cycle

  • 猜测:

    • smsp按 1DADD/cycle 交替发送给2个FP64 core,一个warp需要16个cycle(32inst/16cycle->2inst/cycle)
    • 如果4个sub core同时按这个速度发,则超过了FP64的处理能力(8inst/cycle > 2inst/cycle),但pipe_fp64_cycles_active没有增加
    • 说明,在发射FP64指令之前会检测资源的可用性,如果不足,则不发射,pipe_fp64_cycles_active也就不会增加
    • 也就解释了4个sub core一起执行时,pipe_fp64_cycles_active.max还是16个cycle
    • 执行FP64指令时,4个subcore通过MIO共享FP64实际的执行单元

    在这里插入图片描述

二.查看FP64的峰值性能

tee fp64_peak_sustained.cu<<-'EOF'
#include <cuda_runtime.h>
#include <cuda.h>
__global__ void fake_kernel(){}
int main(int argc,char *argv[])
{
    fake_kernel<<<1, 1>>>();cudaDeviceSynchronize();
}
EOF
/usr/local/cuda/bin/nvcc -std=c++17 -arch=sm_86 -lineinfo  -o fp64_peak_sustained fp64_peak_sustained.cu \
    -I /usr/local/cuda/include -L /usr/local/cuda/lib64 -lcuda
/usr/local/NVIDIA-Nsight-Compute/ncu --metrics \
sm__sass_thread_inst_executed_op_fp64_pred_on.avg.peak_sustained,\
sm__sass_thread_inst_executed_op_fp64_pred_on.sum.peak_sustained ./fp64_peak_sustained

输出

fake_kernel() (1, 1, 1)x(1, 1, 1), Context 1, Stream 7, Device 0, CC 8.6
Section: Command line profiler metrics
---------------------------------------------------------------- ----------- ------------
Metric Name                                                      Metric Unit Metric Value
---------------------------------------------------------------- ----------- ------------
sm__sass_thread_inst_executed_op_fp64_pred_on.avg.peak_sustained  inst/cycle            2  #每个sm的峰值性能
sm__sass_thread_inst_executed_op_fp64_pred_on.sum.peak_sustained  inst/cycle           56  #28个sm
---------------------------------------------------------------- ----------- ------------
  • 2 FP64 cores in devices of compute capability 8.6, 8.7 and 8.9
  • 问题:这2个core怎么给4个sub_core分呢?

三.打满FP64、FP32的利用率,对比差异

tee fp64_test.cu<<-'EOF'
#include <iostream>
#include <cuda_runtime.h>
#include <iostream>
#include <vector>
#include <stdio.h>
#include <assert.h>
#include <cstdio>
#include <cuda.h>

__global__ void kernel_add_float(volatile float *input,volatile float *output)
{
    unsigned int tid  = threadIdx.x + blockIdx.x * blockDim.x;
    float l=input[tid];
    float r=output[tid];
    for(int i=0;i<256;i++)
    {
        l-=r;
    } 
    input[tid]=l;
}
__global__ void kernel_add_double(volatile double *input,volatile double *output)
{
    unsigned int tid  = threadIdx.x + blockIdx.x * blockDim.x;
    double left=input[tid];
    double right=output[tid];
    for(int i=0;i<256;i++)
    {
        left+=right;
    }       
    output[tid]=left;
}
EOF

/usr/local/cuda/bin/nvcc -std=c++17 -dc -lineinfo -arch=sm_86 -ptx fp64_test.cu -o fp64_test.ptx
/usr/local/cuda/bin/nvcc -arch=sm_86 fp64_test.ptx -cubin -o fp64_test.cubin
/usr/local/cuda/bin/nvcc -arch=sm_86 fp64_test.cubin -fatbin -o fp64_test.fatbin
cat fp64_test.ptx
/usr/local/cuda/bin/cuobjdump --dump-sass fp64_test.fatbin

# 删掉除DADD、FADD以外的指令
cuasm.py fp64_test.cubin fp64_test.cuasm
sed '/MOV/d' -i fp64_test.cuasm
sed '/S2R/d' -i fp64_test.cuasm
sed '/ULDC/d' -i fp64_test.cuasm
sed '/IMAD/d' -i fp64_test.cuasm
sed '/LDG/d' -i fp64_test.cuasm
sed '/STG/d' -i fp64_test.cuasm
sed '/F2F/d' -i fp64_test.cuasm

cuasm.py fp64_test.cuasm
/usr/local/cuda/bin/nvcc -arch=sm_86 fp64_test.cubin -fatbin -o fp64_test.fatbin
/usr/local/cuda/bin/cuobjdump --dump-sass fp64_test.fatbin
/usr/local/cuda/bin/cuobjdump --dump-resource-usage fp64_test.fatbin

tee fp64_test_main.cpp<<-'EOF'
#include <stdio.h>
#include <string.h>
#include <cuda_runtime.h>
#include <cuda.h>

int main(int argc,char *argv[])
{
    CUresult error;
    CUdevice cuDevice;
    cuInit(0);
    int deviceCount = 0;
    error = cuDeviceGetCount(&deviceCount);
    error = cuDeviceGet(&cuDevice, 0);
    if(error!=CUDA_SUCCESS)
        {
        printf("Error happened in get device!\n");
    }
    CUcontext cuContext;
    error = cuCtxCreate(&cuContext, 0, cuDevice);
    if(error!=CUDA_SUCCESS)
        {
        printf("Error happened in create context!\n");
    }
    int block_count=28*1000;int block_size=32*4*4;
    int thread_size=block_count*block_size;

    int data_size=sizeof(double)*thread_size;

    double *output_ptr=nullptr;
    double *input_ptr=nullptr;
    int cudaStatus=0;
    cudaStatus = cudaMalloc((void**)&input_ptr, data_size);
    cudaStatus = cudaMalloc((void**)&output_ptr, data_size);
    void *kernelParams[]= {(void*)&output_ptr, (void*)&input_ptr};

    CUmodule module;
    CUfunction double_function;
    CUfunction float_function;
    const char* module_file = "fp64_test.fatbin";
    const char* double_kernel_name = "_Z17kernel_add_doublePVdS0_";
    const char* float_kernel_name = "_Z16kernel_add_floatPVfS0_";
    
    error = cuModuleLoad(&module, module_file);
    if(error!=CUDA_SUCCESS)
        {
        printf("Error happened in load moudle %d!\n",error);
    }
    error = cuModuleGetFunction(&double_function, module, double_kernel_name);
    if(error!=CUDA_SUCCESS)
    {
        printf("get double_function error!\n");
    }
    error = cuModuleGetFunction(&float_function, module, float_kernel_name);
    if(error!=CUDA_SUCCESS)
    {
        printf("get float_kernel_name error!\n");
    }    
    cuLaunchKernel(double_function,
                    block_count, 1, 1,
                    block_size, 1, 1,
                    0,0,kernelParams, 0);
    cuLaunchKernel(float_function,
                    block_count, 1, 1,
                    block_size, 1, 1,
                    0,0,kernelParams, 0);
    cudaFree(output_ptr);
    cudaFree(input_ptr);
    cuModuleUnload(module);
    cuCtxDestroy(cuContext);
    return 0;
}
EOF
g++ fp64_test_main.cpp -o fp64_test_main -I /usr/local/cuda/include -L /usr/local/cuda/lib64 -lcudart -lcuda
/usr/local/NVIDIA-Nsight-Compute/ncu --metrics \
sm__inst_executed.avg.pct_of_peak_sustained_elapsed,\
smsp__inst_issued.sum,\
sm__issue_active.avg.pct_of_peak_sustained_elapsed,\
sm__pipe_fma_cycles_active.avg.pct_of_peak_sustained_elapsed,\
sm__pipe_fmaheavy_cycles_active.avg.pct_of_peak_sustained_elapsed,\
sm__inst_executed_pipe_cbu_pred_on_any.avg.pct_of_peak_sustained_elapsed,\
sm__mio_inst_issued.avg.pct_of_peak_sustained_elapsed,\
sm__mio_pq_read_cycles_active.avg.pct_of_peak_sustained_elapsed,\
sm__mio_pq_write_cycles_active.avg.pct_of_peak_sustained_elapsed,\
sm__mio_pq_write_cycles_active_pipe_lsu.avg.pct_of_peak_sustained_elapsed,\
sm__mio_pq_write_cycles_active_pipe_tex.avg.pct_of_peak_sustained_elapsed,\
sm__mioc_inst_issued.avg.pct_of_peak_sustained_elapsed,\
sm__mio_inst_issued.avg.pct_of_peak_sustained_elapsed,\
sm__pipe_fp64_cycles_active.avg.pct_of_peak_sustained_elapsed ./fp64_test_main

输出

kernel_add_double(volatile double *, volatile double *) (28000, 1, 1)x(512, 1, 1), Context 1, Stream 7, Device 0, CC 8.6
Section: Command line profiler metrics
------------------------------------------------------------------------- ----------- ------------
Metric Name                                                               Metric Unit Metric Value
------------------------------------------------------------------------- ----------- ------------
sm__inst_executed.avg.pct_of_peak_sustained_elapsed                                 %         1.32
sm__inst_executed_pipe_cbu_pred_on_any.avg.pct_of_peak_sustained_elapsed            %         0.02
sm__issue_active.avg.pct_of_peak_sustained_elapsed                                  %         1.32
sm__mio_inst_issued.avg.pct_of_peak_sustained_elapsed                               %         3.51
sm__mio_pq_read_cycles_active.avg.pct_of_peak_sustained_elapsed                     %            0
sm__mio_pq_write_cycles_active.avg.pct_of_peak_sustained_elapsed                    %        21.05
sm__mio_pq_write_cycles_active_pipe_lsu.avg.pct_of_peak_sustained_elapsed           %            0
sm__mio_pq_write_cycles_active_pipe_tex.avg.pct_of_peak_sustained_elapsed           %        21.05 # of cycles where register operands from the register file were
                                                                                                     written to MIO PQ, for the tex pipe
sm__mioc_inst_issued.avg.pct_of_peak_sustained_elapsed                              %         1.32
sm__pipe_fma_cycles_active.avg.pct_of_peak_sustained_elapsed                        %            0
sm__pipe_fmaheavy_cycles_active.avg.pct_of_peak_sustained_elapsed                   %            0
sm__pipe_fp64_cycles_active.avg.pct_of_peak_sustained_elapsed                       %        84.21  #利用率打不满
smsp__inst_issued.sum                                                            inst  115,136,000  #跟fp32相同的指令条数
------------------------------------------------------------------------- ----------- ------------

kernel_add_float(volatile float *, volatile float *) (28000, 1, 1)x(512, 1, 1), Context 1, Stream 7, Device 0, CC 8.6
Section: Command line profiler metrics
------------------------------------------------------------------------- ----------- ------------
Metric Name                                                               Metric Unit Metric Value
------------------------------------------------------------------------- ----------- ------------
sm__inst_executed.avg.pct_of_peak_sustained_elapsed                                 %        99.76
sm__inst_executed_pipe_cbu_pred_on_any.avg.pct_of_peak_sustained_elapsed            %         1.55
sm__issue_active.avg.pct_of_peak_sustained_elapsed                                  %        99.76
sm__mio_inst_issued.avg.pct_of_peak_sustained_elapsed                               %            0
sm__mio_pq_read_cycles_active.avg.pct_of_peak_sustained_elapsed                     %            0
sm__mio_pq_write_cycles_active.avg.pct_of_peak_sustained_elapsed                    %            0
sm__mio_pq_write_cycles_active_pipe_lsu.avg.pct_of_peak_sustained_elapsed           %            0
sm__mio_pq_write_cycles_active_pipe_tex.avg.pct_of_peak_sustained_elapsed           %            0
sm__mioc_inst_issued.avg.pct_of_peak_sustained_elapsed                              %         0.39
sm__pipe_fma_cycles_active.avg.pct_of_peak_sustained_elapsed                        %        99.37
sm__pipe_fmaheavy_cycles_active.avg.pct_of_peak_sustained_elapsed                   %        99.37
sm__pipe_fp64_cycles_active.avg.pct_of_peak_sustained_elapsed                       %            0
smsp__inst_issued.sum                                                            inst  115,136,000
------------------------------------------------------------------------- ----------- ------------

*猜测,sm__pipe_fp64_cycles_active并不是那2个FP64 core的metrics,而是smsp里通往fp64 core的接口模块的活动cycle数
*4个subcore里的fp64接口模块,连接到2个fp64 core,并且经过了mio模块.因此,无法打满fp64的利用率

四.进一步证明pipe_fp64_cycles_active并不是2个fp64 core的metrics

tee fp64_test.cu<<-'EOF'
#include <iostream>
#include <cuda_runtime.h>
#include <iostream>
#include <vector>
#include <stdio.h>
#include <assert.h>
#include <cstdio>
#include <cuda.h>

__global__ void kernel_add_double(volatile double *input,volatile double *output)
{
    unsigned int tid  = threadIdx.x + blockIdx.x * blockDim.x;
    double left=input[tid];
    double right=output[tid];
    for(int i=0;i<1;i++)
    {
        left+=right;
    }       
    output[tid]=left;
}
EOF

/usr/local/cuda/bin/nvcc -std=c++17 -dc -lineinfo -arch=sm_86 -ptx fp64_test.cu -o fp64_test.ptx
/usr/local/cuda/bin/nvcc -arch=sm_86 fp64_test.ptx -cubin -o fp64_test.cubin
/usr/local/cuda/bin/nvcc -arch=sm_86 fp64_test.cubin -fatbin -o fp64_test.fatbin
cat fp64_test.ptx
/usr/local/cuda/bin/cuobjdump --dump-sass fp64_test.fatbin

cuasm.py fp64_test.cubin fp64_test.cuasm
sed '/MOV/d' -i fp64_test.cuasm
sed '/S2R/d' -i fp64_test.cuasm
sed '/ULDC/d' -i fp64_test.cuasm
sed '/IMAD/d' -i fp64_test.cuasm
sed '/LDG/d' -i fp64_test.cuasm
sed '/STG/d' -i fp64_test.cuasm
sed '/F2F/d' -i fp64_test.cuasm

cuasm.py fp64_test.cuasm
/usr/local/cuda/bin/nvcc -arch=sm_86 fp64_test.cubin -fatbin -o fp64_test.fatbin
/usr/local/cuda/bin/cuobjdump --dump-sass fp64_test.fatbin
/usr/local/cuda/bin/cuobjdump --dump-resource-usage fp64_test.fatbin

tee fp64_test_main.cpp<<-'EOF'
#include <stdio.h>
#include <string.h>
#include <cuda_runtime.h>
#include <cuda.h>

int main(int argc,char *argv[])
{
    CUresult error;
    CUdevice cuDevice;
    cuInit(0);
    int deviceCount = 0;
    error = cuDeviceGetCount(&deviceCount);
    error = cuDeviceGet(&cuDevice, 0);
    if(error!=CUDA_SUCCESS)
        {
        printf("Error happened in get device!\n");
    }
    CUcontext cuContext;
    error = cuCtxCreate(&cuContext, 0, cuDevice);
    if(error!=CUDA_SUCCESS)
        {
        printf("Error happened in create context!\n");
    }
    int block_count=1;int block_size=32*4*4;
    int thread_size=block_count*block_size;

    int data_size=sizeof(double)*thread_size;

    double *output_ptr=nullptr;
    double *input_ptr=nullptr;
    int cudaStatus=0;
    cudaStatus = cudaMalloc((void**)&input_ptr, data_size);
    cudaStatus = cudaMalloc((void**)&output_ptr, data_size);
    void *kernelParams[]= {(void*)&output_ptr, (void*)&input_ptr};

    CUmodule module;
    CUfunction double_function;
    const char* module_file = "fp64_test.fatbin";
    const char* double_kernel_name = "_Z17kernel_add_doublePVdS0_";
    
    error = cuModuleLoad(&module, module_file);
    if(error!=CUDA_SUCCESS)
        {
        printf("Error happened in load moudle %d!\n",error);
    }
    error = cuModuleGetFunction(&double_function, module, double_kernel_name);
    if(error!=CUDA_SUCCESS)
    {
        printf("get float_kernel_name error!\n");
    }    
    cuLaunchKernel(double_function,block_count, 1, 1,
                    8, 1, 1,0,0,kernelParams, 0);
    cuLaunchKernel(double_function,block_count, 1, 1,
                    16, 1, 1,0,0,kernelParams, 0);
    cuLaunchKernel(double_function,block_count, 1, 1,
                    32, 1, 1,0,0,kernelParams, 0);
    cuLaunchKernel(double_function,block_count, 1, 1,
                    32*2, 1, 1,0,0,kernelParams, 0);
    cuLaunchKernel(double_function,block_count, 1, 1,
                    32*4, 1, 1,0,0,kernelParams, 0);
    cuLaunchKernel(double_function,block_count, 1, 1,
                    32*5, 1, 1,0,0,kernelParams, 0);
    cuLaunchKernel(double_function,block_count, 1, 1,
                    32*4*8, 1, 1,0,0,kernelParams, 0);
    cudaFree(output_ptr);
    cudaFree(input_ptr);
    cuModuleUnload(module);
    cuCtxDestroy(cuContext);
    return 0;
}
EOF
g++ fp64_test_main.cpp -o fp64_test_main -I /usr/local/cuda/include -L /usr/local/cuda/lib64 -lcudart -lcuda

/usr/local/NVIDIA-Nsight-Compute/ncu --metrics smsp__pipe_fp64_cycles_active ./fp64_test_main

输出

kernel_add_double(volatile double *, volatile double *) (1, 1, 1)x(8, 1, 1), Context 1, Stream 7, Device 0, CC 8.6
Section: Command line profiler metrics
--------------------------------- ----------- ------------
Metric Name                       Metric Unit Metric Value
--------------------------------- ----------- ------------
smsp__pipe_fp64_cycles_active.avg       cycle         0.14
smsp__pipe_fp64_cycles_active.max       cycle           16
smsp__pipe_fp64_cycles_active.min       cycle            0
smsp__pipe_fp64_cycles_active.sum       cycle           16
--------------------------------- ----------- ------------

kernel_add_double(volatile double *, volatile double *) (1, 1, 1)x(16, 1, 1), Context 1, Stream 7, Device 0, CC 8.6
Section: Command line profiler metrics
--------------------------------- ----------- ------------
Metric Name                       Metric Unit Metric Value
--------------------------------- ----------- ------------
smsp__pipe_fp64_cycles_active.avg       cycle         0.14
smsp__pipe_fp64_cycles_active.max       cycle           16  #不足一个warp跟一个warp 的pipe_fp64_cycles_active一样,说明存在无效计算
smsp__pipe_fp64_cycles_active.min       cycle            0
smsp__pipe_fp64_cycles_active.sum       cycle           16
--------------------------------- ----------- ------------

kernel_add_double(volatile double *, volatile double *) (1, 1, 1)x(32, 1, 1), Context 1, Stream 7, Device 0, CC 8.6
Section: Command line profiler metrics
--------------------------------- ----------- ------------
Metric Name                       Metric Unit Metric Value
--------------------------------- ----------- ------------
smsp__pipe_fp64_cycles_active.avg       cycle         0.14
smsp__pipe_fp64_cycles_active.max       cycle           16
smsp__pipe_fp64_cycles_active.min       cycle            0
smsp__pipe_fp64_cycles_active.sum       cycle           16
--------------------------------- ----------- ------------

kernel_add_double(volatile double *, volatile double *) (1, 1, 1)x(64, 1, 1), Context 1, Stream 7, Device 0, CC 8.6
Section: Command line profiler metrics
--------------------------------- ----------- ------------
Metric Name                       Metric Unit Metric Value
--------------------------------- ----------- ------------
smsp__pipe_fp64_cycles_active.avg       cycle         0.29
smsp__pipe_fp64_cycles_active.max       cycle           16
smsp__pipe_fp64_cycles_active.min       cycle            0
smsp__pipe_fp64_cycles_active.sum       cycle           32
--------------------------------- ----------- ------------

kernel_add_double(volatile double *, volatile double *) (1, 1, 1)x(128, 1, 1), Context 1, Stream 7, Device 0, CC 8.6
Section: Command line profiler metrics
--------------------------------- ----------- ------------
Metric Name                       Metric Unit Metric Value
--------------------------------- ----------- ------------
smsp__pipe_fp64_cycles_active.avg       cycle         0.57
smsp__pipe_fp64_cycles_active.max       cycle           16
smsp__pipe_fp64_cycles_active.min       cycle            0
smsp__pipe_fp64_cycles_active.sum       cycle           64
--------------------------------- ----------- ------------

kernel_add_double(volatile double *, volatile double *) (1, 1, 1)x(160, 1, 1), Context 1, Stream 7, Device 0, CC 8.6
Section: Command line profiler metrics
--------------------------------- ----------- ------------
Metric Name                       Metric Unit Metric Value
--------------------------------- ----------- ------------
smsp__pipe_fp64_cycles_active.avg       cycle         0.71
smsp__pipe_fp64_cycles_active.max       cycle           32
smsp__pipe_fp64_cycles_active.min       cycle            0
smsp__pipe_fp64_cycles_active.sum       cycle           80
--------------------------------- ----------- ------------

kernel_add_double(volatile double *, volatile double *) (1, 1, 1)x(1024, 1, 1), Context 1, Stream 7, Device 0, CC 8.6
Section: Command line profiler metrics
--------------------------------- ----------- ------------
Metric Name                       Metric Unit Metric Value
--------------------------------- ----------- ------------
smsp__pipe_fp64_cycles_active.avg       cycle         4.57
smsp__pipe_fp64_cycles_active.max       cycle          128
smsp__pipe_fp64_cycles_active.min       cycle            0
smsp__pipe_fp64_cycles_active.sum       cycle          512 #每个smsp 执行一个warp的fp64需要16个pipe_fp64_cycles_active
--------------------------------- ----------- ------------
  • 如果是2个fp64 cores的metrics,不会出现这样的现象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2120798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在Linux中从视频流截取图片帧(ffmpeg )

Linux依赖说明: 说明: 使用到的 依赖包 1. ffmpegsudo apt update sudo apt-get install ffmpeg2. imagemagick (选装) (检测图像边缘信息推断清晰度,如果是简单截取但个图像帧>用不到<)sudo apt-get install imagemagick备注: 指令及相关参数说明核心指令: (作用: 执…

docker部署rabbitMQ 单机版

获取rabbit镜像&#xff1a;我们选择带有“mangement”的版本&#xff08;包含web管理页面&#xff09;&#xff1b; docker pull rabbitmq:management 创建并运行容器&#xff1a; docker run -d --name rabbitmq -p 5677:5672 -p 15677:15672 rabbitmq:management --name:…

InVEST实践及在生态系统服务供需、固碳、城市热岛、论文写作等实际项目中的具体应用

不论您是小白亦或是已经能够成功运行InVEST模型生成结果&#xff0c;您可以自由选择课程内容&#xff0c;如果您是小白老师手把手教您&#xff0c;如果您已经是InVEST模型熟悉者&#xff0c;已经为您准备了结合实际项目内容以及通过模型进行高质量的论文重现&#xff0c;还有很…

Java面试题-基础和框架-Java面试题二

1、什么是抽象类&#xff1f; 在 Java 中&#xff0c;抽象类用于创建具有某些被子类实现的默认方法的类&#xff0c;一个抽象类可以有没有方法体的抽象方法&#xff0c;也可以有和普通类一样有方法体的方法。 abstract 关键字用于声明一个抽象类&#xff0c;抽象类无法实例化…

Docker容器的基础命令操作大全(入门必看)

本指南将带您深入了解Docker的基本操作&#xff0c;包括镜像的管理、容器的创建与删除&#xff0c;以及如何高效地使用Docker进行开发和部署。通过这些内容&#xff0c;您将掌握Docker的核心概念&#xff0c;为未来的项目奠定坚实的基础。让我们一起开启这段探索之旅&#xff0…

安装open-webui报错

通过docker安装open-webui容器一直重启中 提示报错“OpenBLAS blas_thread_init: pthread_create failed for thread 1 of 16: Operation not permitted...” 解决&#xff1a; 在容器启动命令中加上--privilegedtrue

AIAutoPrediction足球数据分析软件工具安装教程(附带操作截图)

文章目录 前言一、AIAutoPrediction是什么&#xff1f;二、AIAutoPrediction能做什么&#xff1f;即时大小球预测即时亚盘预测大小球、亚盘初盘分析 三、安装教程1、软件下载2、打开安装包&#xff0c;进行软件安装3、选择安装目录4、执行安装5、安装完成6、开始使用 总结 前言…

Tomcat服务器安装SSL证书教程

Tomcat服务器安装SSL证书教程&#xff0c;主要包括获取证书、安装证书、重启Tomcat以及测试SSL证书是否安装成功等4大步骤&#xff0c;以下是详细图文教程。 一、获取证书 现在锐成信息申请一张SSL证书&#xff0c;证书申请成功后&#xff0c;会获取到颁发证书文件&#xff0…

队列+宽搜(BFS)

前言 宽搜属于搜索类算法 搜索类算法&#xff1a; 深搜&#xff08;DFS&#xff09;宽搜&#xff08;BFS&#xff09; 宽搜可以解决树、图、最短路径、迷宫、拓扑排序等问题 429. N 叉树的层序遍历 题目链接&#xff1a;429. N 叉树的层序遍历 题目解析 题目意思就是对这个…

ETCD的备份和恢复

一、引言 ETCD是一个高度可用的键值存储系统&#xff0c;被广泛应用于Kubernetes等分布式系统中以存储关键配置数据和服务发现信息。由于ETCD的重要性&#xff0c;确保其数据的安全性和可靠性至关重要。本文将介绍ETCD备份与恢复的基础知识、常用方法及最佳实践。 二、概述 …

Qt绘制动态仪表

背景&#xff1a; 项目需要&#xff0c;可能需要做一些仪表显示。此篇除了介绍实现方法&#xff0c;还要说明心路历程。对我而言&#xff0c;重要的是心理&#xff0c;而不是技术。写下来也是自勉。 本人起初心里是比较抵触的&#xff0c;从业20多年了&#xff0c;深知所谓界…

Linux 中 Tail 命令的 9 个实用示例

引言 我们作为 Linux 用户&#xff0c;经常会操作那些在后台长时间运行的进程&#xff0c;这些进程被称作守护进程或服务。例如 Secure Shell (sshd)、Network Manager (networkd)、Volume Manager (LVM)、Cron 等都是服务的典型例子&#xff0c;这样的服务还有很多。 在许多情…

1.10 DFT示例1

1.10 DFT示例1 Tips&#xff1a;离散傅里叶的不同角度的解释。 参考&#xff1a;https://mp.weixin.qq.com/s/TrRmqkc34Zqw9pgaITqlZg?poc_tokenHF5h1WajXiXCmFpwIbv1HaHN52KsET1UE29CM561 摘取部分核心观点&#xff1a; 站在高观点下看问题&#xff0c;傅里叶变换本质上是…

MySQL表的操作与数据类型

目录 前言 一、表的操作 1.创建一个表 2.查看表的结构 3.修改表 4.删除一个表 二、 MySQL的数据类型 0.数据类型一览&#xff1a; 1.整数类型 2.位类型 3.小数类型 4.字符类型 前言 在MySQL库的操作一文中介绍了有关MySQL库的操作&#xff0c;本节要讲解的是由库管理的结构——…

PointNet++改进策略 :模块改进 | x-Conv | PointCNN, 结合局部结构与全局排列提升模型性能

目录 前言PointCNN实现细节1. X X X-Conv 操作输入输出步骤 2. PointCNN 网络架构层级卷积分类与分割任务 3. 数据增强4. 效率优化 前言 这篇论文介绍了一种名为 PointCNN 的方法&#xff0c;旨在从点云&#xff08;point cloud&#xff09;数据中学习特征。传统卷积神经网络…

华为 HCIP-Datacom H12-821 题库 (9)

有需要题库的可以看主页置顶 V群进行学习交流 1.以下关于 RSTP 保护功能的描述&#xff0c;错误的是哪一选项&#xff1f; A、环路保护可以部署在根端口上&#xff0c;以防网络中形成环路 B、环路保护可以部署在Alternate 端口上&#xff0c;以防网络中形成环路 C、BPDU 保…

“短视频 + ”新业态下的高职院校数字媒体技术专业群建设方案

一、引言 短视频&#xff0c;亦称短片视频&#xff0c;是在移动互联网快速普及背景下兴起的一种新兴媒体形态&#xff0c;它继承了传统影视行业的一些特点并加以创新。相较于传统的文字和图片传播方式&#xff0c;短视频集声音与影像于一体&#xff0c;能够承载更多的信息量&a…

【JAVA开源】基于Vue和SpringBoot的网上订餐系统

本文项目编号 T 018 &#xff0c;文末自助获取源码 \color{red}{T018&#xff0c;文末自助获取源码} T018&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…

缓存对象反序列化失败

未定义serialVersionUID&#xff0c;会自动生成序列化号 新增了属性&#xff0c;序列号就变了&#xff0c;导致缓存对象反序列化失败。 所有缓存对象必须指定序列化id&#xff01; 那我如何找到未添加字段前 对象的序列化号呢&#xff1f;默认的序列化号是如何生成的呢&#…

11、Hive+Spark数仓环境准备

1、 Hive安装部署 1&#xff09;把hive-3.1.3.tar.gz上传到linux的/opt/software目录下 2&#xff09;解压hive-3.1.3.tar.gz到/opt/module/目录下面 [shuidihadoop102 module]$ tar -zxvf /opt/software/hive-3.1.3.tar.gz -C /opt/module/ 3&#xff09;修改hive-3.1.3-b…