MKL官网所有文档:https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation/
MKL使用详细手册:https://software.intel.com/sites/default/files/mkl-2019-developer-reference-c_0.pdf
MKL中文入门博客:https://blog.csdn.net/zb1165048017/article/category/6857730

LAPACK学习文档:https://software.intel.com/sites/products/documentation/doclib/mkl_sa/11/mkl_lapack_examples/index.htm
查找LAPACK函数工具:https://software.intel.com/en-us/articles/intel-mkl-function-finding-advisor
查找链接库工具:https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor/
intel c++ compiler与GNU c++ compiler对MKL的比较
GNU c++ compiler = gcc,gcc -o dgemm_with_timing_gcc dgemm_with_timing.c -lmkl_rt
intel c++ compiler = icc,icc -o dgemm_with_timing_icc dgemm_with_timing.c -mkl
LOOP_COUNT=220,最终结果是4.50294 vs 4.50688 ms,所以姑且认为编译器对MKL并没有多大的影响。

安装

在intel官网注册并下载mkl:https://software.intel.com/en-us/mkl
Linux下安装:
mklvars.sh说明: https://software.intel.com/en-us/mkl-linux-developer-guide-scripts-to-set-environment-variables

wget http://registrationcenter-download.intel.com/akdlm/irc_nas/tec/14895/l_mkl_2019.1.144.tgz
tar -zxvf l_mkl_2019.1.144.tgz
cd l_mkl_2019.1.144/
./install.sh
sudo vim /etc/ld.so.conf.d/intel-mkl.conf/path/intel/mkl/lib/intel64/path/intel/lib/intel64
sudo ldconfig
cd /path/intel/mkl/bin
source mklvars.sh intel64
vim dgemm_example.c  # input your code
gcc -o run_dgemm_example dgemm_example.c -lmkl_rt

实例

第一次入门教程:https://software.intel.com/en-us/mkl-tutorial-c-overview
mkl_malloc(), mkl_free(),
cblas_dgemm(), dsecnd(),
mkl_get_max_threads(), mkl_set_num_threads()

所有实例:https://software.intel.com/en-us/product-code-samples

wget https://software.intel.com/sites/default/files/ipsxe2019_samples_lin_20180731.tgz
mkdir ipsxe2019_samples_lin_20180731
tar -zxvf ipsxe2019_samples_lin_20180731.tgz -C ipsxe2019_samples_lin_20180731


(1)源码:dgemm_example.c
介绍mkl_malloc(), mkl_free(), cblas_dgemm()的用法。

#include <stdio.h>
#include <stdlib.h>#include "mkl.h"#define min(x,y) (((x) < (y)) ? (x) : (y))int main()
{double *A, *B, *C;int m, n, k, i, j;double alpha, beta;printf ("\n This example computes real matrix C=alpha*A*B+beta*C using \n"" Intel(R) MKL function dgemm, where A, B, and  C are matrices and \n"" alpha and beta are double precision scalars\n\n");m = 2000, k = 200, n = 1000;printf (" Initializing data for matrix multiplication C=A*B for matrix \n"" A(%ix%i) and matrix B(%ix%i)\n\n", m, k, k, n);alpha = 1.0; beta = 0.0;printf (" Allocating memory for matrices aligned on 64-byte boundary for better \n"" performance \n\n");A = (double *)mkl_malloc( m*k*sizeof( double ), 64 );B = (double *)mkl_malloc( k*n*sizeof( double ), 64 );C = (double *)mkl_malloc( m*n*sizeof( double ), 64 );if (A == NULL || B == NULL || C == NULL) {printf( "\n ERROR: Can't allocate memory for matrices. Aborting... \n\n");mkl_free(A);mkl_free(B);mkl_free(C);return 1;}printf (" Intializing matrix data \n\n");for (i = 0; i < (m*k); i++) {A[i] = (double)(i+1);}for (i = 0; i < (k*n); i++) {B[i] = (double)(-i-1);}for (i = 0; i < (m*n); i++) {C[i] = 0.0;}printf (" Computing matrix product using Intel(R) MKL dgemm function via CBLAS interface \n\n");cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,m, n, k, alpha, A, k, B, n, beta, C, n);printf ("\n Computations completed.\n\n");printf (" Top left corner of matrix A: \n");for (i=0; i<min(m,6); i++) {for (j=0; j<min(k,6); j++) {printf ("%12.0f", A[j+i*k]);}printf ("\n");}printf ("\n Top left corner of matrix B: \n");for (i=0; i<min(k,6); i++) {for (j=0; j<min(n,6); j++) {printf ("%12.0f", B[j+i*n]);}printf ("\n");}printf ("\n Top left corner of matrix C: \n");for (i=0; i<min(m,6); i++) {for (j=0; j<min(n,6); j++) {printf ("%12.5G", C[j+i*n]);}printf ("\n");}printf ("\n Deallocating memory \n\n");mkl_free(A);mkl_free(B);mkl_free(C);printf (" Example completed. \n\n");return 0;
}cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,m, n, k, alpha, A, k, B, n, beta, C, n);// C = alpha *A * B + beta * C
// CblasRowMajor:表示矩阵按行主顺序存储,矩阵每行的元素连续存储。
// CblasNoTrans:枚举类型,表示矩阵A和B不应在乘法之前进行转置或共轭转置。
// m, n, k:表示矩阵大小的整数,A:m行乘k列。B:k行乘n列。C:m行n列
// alpha:用于缩放矩阵A和B的乘积的实际值。
// A:用于存储矩阵A的数组。
// k:数组A的前导维度,或内存中连续行(行主存储)之间的元素数量。在本练习的情况下,前导尺寸与列数相同。
// B:用于存储矩阵B的数组。
// n:数组B的前导维度,或内存中连续行(行主存储)之间的元素数量。在本练习的情况下,前导尺寸与列数相同。
// beta:用于缩放矩阵C的实际值。
// C:用于存储矩阵C的数组。
// n:数组C的前导维度,或内存中连续行(行主存储)之间的元素数。在本练习的情况下,前导尺寸与列数相同。

运行结果如下:

$ ./run_dgemm_exampleThis example computes real matrix C=alpha*A*B+beta*C usingIntel(R) MKL function dgemm, where A, B, and  C are matrices andalpha and beta are double precision scalarsInitializing data for matrix multiplication C=A*B for matrixA(2000x200) and matrix B(200x1000)Allocating memory for matrices aligned on 64-byte boundary for betterperformanceIntializing matrix dataComputing matrix product using Intel(R) MKL dgemm function via CBLAS interfaceComputations completed.Top left corner of matrix A:1           2           3           4           5           6201         202         203         204         205         206401         402         403         404         405         406601         602         603         604         605         606801         802         803         804         805         8061001        1002        1003        1004        1005        1006Top left corner of matrix B:-1          -2          -3          -4          -5          -6-1001       -1002       -1003       -1004       -1005       -1006-2001       -2002       -2003       -2004       -2005       -2006-3001       -3002       -3003       -3004       -3005       -3006-4001       -4002       -4003       -4004       -4005       -4006-5001       -5002       -5003       -5004       -5005       -5006Top left corner of matrix C:-2.6666E+09 -2.6666E+09 -2.6667E+09 -2.6667E+09 -2.6667E+09 -2.6667E+09-6.6467E+09 -6.6467E+09 -6.6468E+09 -6.6468E+09 -6.6469E+09  -6.647E+09-1.0627E+10 -1.0627E+10 -1.0627E+10 -1.0627E+10 -1.0627E+10 -1.0627E+10-1.4607E+10 -1.4607E+10 -1.4607E+10 -1.4607E+10 -1.4607E+10 -1.4607E+10-1.8587E+10 -1.8587E+10 -1.8587E+10 -1.8587E+10 -1.8588E+10 -1.8588E+10-2.2567E+10 -2.2567E+10 -2.2567E+10 -2.2567E+10 -2.2568E+10 -2.2568E+10Deallocating memoryExample completed.


(2)源码:dgemm_with_timing.c
介绍dsecnd()用于统计性能情况。

#include <stdio.h>
#include <stdlib.h>
#include "mkl.h"/* Consider adjusting LOOP_COUNT based on the performance of your computer */
/* to make sure that total run time is at least 1 second */
#define LOOP_COUNT 10int main()
{double *A, *B, *C;int m, n, p, i, r;double alpha, beta;double s_initial, s_elapsed;printf ("\n This example measures performance of Intel(R) MKL function dgemm \n"" computing real matrix C=alpha*A*B+beta*C, where A, B, and C \n"" are matrices and alpha and beta are double precision scalars\n\n");m = 2000, p = 200, n = 1000;printf (" Initializing data for matrix multiplication C=A*B for matrix \n"" A(%ix%i) and matrix B(%ix%i)\n\n", m, p, p, n);alpha = 1.0; beta = 0.0;printf (" Allocating memory for matrices aligned on 64-byte boundary for better \n"" performance \n\n");A = (double *)mkl_malloc( m*p*sizeof( double ), 64 );B = (double *)mkl_malloc( p*n*sizeof( double ), 64 );C = (double *)mkl_malloc( m*n*sizeof( double ), 64 );if (A == NULL || B == NULL || C == NULL) {printf( "\n ERROR: Can't allocate memory for matrices. Aborting... \n\n");mkl_free(A);mkl_free(B);mkl_free(C);return 1;}printf (" Intializing matrix data \n\n");for (i = 0; i < (m*p); i++) {A[i] = (double)(i+1);}for (i = 0; i < (p*n); i++) {B[i] = (double)(-i-1);}for (i = 0; i < (m*n); i++) {C[i] = 0.0;}printf (" Making the first run of matrix product using Intel(R) MKL dgemm function \n"" via CBLAS interface to get stable run time measurements \n\n");cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,m, n, p, alpha, A, p, B, n, beta, C, n);printf (" Measuring performance of matrix product using Intel(R) MKL dgemm function \n"" via CBLAS interface \n\n");s_initial = dsecnd();for (r = 0; r < LOOP_COUNT; r++) {cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,m, n, p, alpha, A, p, B, n, beta, C, n);}s_elapsed = (dsecnd() - s_initial) / LOOP_COUNT;printf (" == Matrix multiplication using Intel(R) MKL dgemm completed == \n"" == at %.5f milliseconds == \n\n", (s_elapsed * 1000));printf (" Deallocating memory \n\n");mkl_free(A);mkl_free(B);mkl_free(C);if (s_elapsed < 0.9/LOOP_COUNT) {s_elapsed=1.0/LOOP_COUNT/s_elapsed;i=(int)(s_elapsed*LOOP_COUNT)+1;printf(" It is highly recommended to define LOOP_COUNT for this example on your \n"" computer as %i to have total execution time about 1 second for reliability \n"" of measurements\n\n", i);}printf (" Example completed. \n\n");return 0;
}

运行结果如下:

$ ./run_dgemm_with_timingThis example measures performance of Intel(R) MKL function dgemmcomputing real matrix C=alpha*A*B+beta*C, where A, B, and Care matrices and alpha and beta are double precision scalarsInitializing data for matrix multiplication C=A*B for matrixA(2000x200) and matrix B(200x1000)Allocating memory for matrices aligned on 64-byte boundary for betterperformanceIntializing matrix dataMaking the first run of matrix product using Intel(R) MKL dgemm functionvia CBLAS interface to get stable run time measurementsMeasuring performance of matrix product using Intel(R) MKL dgemm functionvia CBLAS interface== Matrix multiplication using Intel(R) MKL dgemm completed ==== at 4.53907 milliseconds ==Deallocating memoryIt is highly recommended to define LOOP_COUNT for this example on yourcomputer as 221 to have total execution time about 1 second for reliabilityof measurementsExample completed.


(3)源码:matrix_multiplication.c
用于比较普通CPU计算和MKL的性能差距。

#define min(x,y) (((x) < (y)) ? (x) : (y))#include <stdio.h>
#include <stdlib.h>
#include "mkl.h"/* Consider adjusting LOOP_COUNT based on the performance of your computer */
/* to make sure that total run time is at least 1 second */
#define LOOP_COUNT 10int main()
{double *A, *B, *C;int m, n, p, i, j, k, r;double alpha, beta;double sum;double s_initial, s_elapsed;printf ("\n This example measures performance of rcomputing the real matrix product \n"" C=alpha*A*B+beta*C using a triple nested loop, where A, B, and C are \n"" matrices and alpha and beta are double precision scalars \n\n");m = 2000, p = 200, n = 1000;printf (" Initializing data for matrix multiplication C=A*B for matrix \n"" A(%ix%i) and matrix B(%ix%i)\n\n", m, p, p, n);alpha = 1.0; beta = 0.0;printf (" Allocating memory for matrices aligned on 64-byte boundary for better \n"" performance \n\n");A = (double *)mkl_malloc( m*p*sizeof( double ), 64 );B = (double *)mkl_malloc( p*n*sizeof( double ), 64 );C = (double *)mkl_malloc( m*n*sizeof( double ), 64 );if (A == NULL || B == NULL || C == NULL) {printf( "\n ERROR: Can't allocate memory for matrices. Aborting... \n\n");mkl_free(A);mkl_free(B);mkl_free(C);return 1;}printf (" Intializing matrix data \n\n");for (i = 0; i < (m*p); i++) {A[i] = (double)(i+1);}for (i = 0; i < (p*n); i++) {B[i] = (double)(-i-1);}for (i = 0; i < (m*n); i++) {C[i] = 0.0;}printf (" Making the first run of matrix product using triple nested loop\n"" to get stable run time measurements \n\n");for (i = 0; i < m; i++) {for (j = 0; j < n; j++) {sum = 0.0;for (k = 0; k < p; k++)sum += A[p*i+k] * B[n*k+j];C[n*i+j] = sum;}}printf (" Measuring performance of matrix product using triple nested loop \n\n");s_initial = dsecnd();for (r = 0; r < LOOP_COUNT; r++) {for (i = 0; i < m; i++) {for (j = 0; j < n; j++) {sum = 0.0;for (k = 0; k < p; k++)sum += A[p*i+k] * B[n*k+j];C[n*i+j] = sum;}}}s_elapsed = (dsecnd() - s_initial) / LOOP_COUNT;printf (" == Matrix multiplication using triple nested loop completed == \n"" == at %.5f milliseconds == \n\n", (s_elapsed * 1000));printf (" Deallocating memory \n\n");mkl_free(A);mkl_free(B);mkl_free(C);if (s_elapsed < 0.9/LOOP_COUNT) {s_elapsed=1.0/LOOP_COUNT/s_elapsed;i=(int)(s_elapsed*LOOP_COUNT)+1;printf(" It is highly recommended to define LOOP_COUNT for this example on your \n"" computer as %i to have total execution time about 1 second for reliability \n"" of measurements\n\n", i);}printf (" Example completed. \n\n");return 0;
}

运行结果如下:

$ ./run_matrix_multiplicationThis example measures performance of rcomputing the real matrix productC=alpha*A*B+beta*C using a triple nested loop, where A, B, and C arematrices and alpha and beta are double precision scalarsInitializing data for matrix multiplication C=A*B for matrixA(2000x200) and matrix B(200x1000)Allocating memory for matrices aligned on 64-byte boundary for betterperformanceIntializing matrix dataMaking the first run of matrix product using triple nested loopto get stable run time measurementsMeasuring performance of matrix product using triple nested loop== Matrix multiplication using triple nested loop completed ==== at 1408.21425 milliseconds ==Deallocating memoryExample completed.


(4)源码:dgemm_threading_effect_example.c
用于设置MKL运行的线程数,mkl_set_num_threads()。

#include <stdio.h>
#include <stdlib.h>
#include "mkl.h"/* Consider adjusting LOOP_COUNT based on the performance of your computer */
/* to make sure that total run time is at least 1 second */
#define LOOP_COUNT 220  // 220 用于更精确的统计int main()
{double *A, *B, *C;int m, n, p, i, j, r, max_threads;double alpha, beta;double s_initial, s_elapsed;printf ("\n This example demonstrates threading impact on computing real matrix product \n"" C=alpha*A*B+beta*C using Intel(R) MKL function dgemm, where A, B, and C are \n"" matrices and alpha and beta are double precision scalars \n\n");m = 2000, p = 200, n = 1000;printf (" Initializing data for matrix multiplication C=A*B for matrix \n"" A(%ix%i) and matrix B(%ix%i)\n\n", m, p, p, n);alpha = 1.0; beta = 0.0;printf (" Allocating memory for matrices aligned on 64-byte boundary for better \n"" performance \n\n");A = (double *)mkl_malloc( m*p*sizeof( double ), 64 );B = (double *)mkl_malloc( p*n*sizeof( double ), 64 );C = (double *)mkl_malloc( m*n*sizeof( double ), 64 );if (A == NULL || B == NULL || C == NULL) {printf( "\n ERROR: Can't allocate memory for matrices. Aborting... \n\n");mkl_free(A);mkl_free(B);mkl_free(C);return 1;}printf (" Intializing matrix data \n\n");for (i = 0; i < (m*p); i++) {A[i] = (double)(i+1);}for (i = 0; i < (p*n); i++) {B[i] = (double)(-i-1);}for (i = 0; i < (m*n); i++) {C[i] = 0.0;}max_threads = mkl_get_max_threads();printf (" Finding max number %d of threads Intel(R) MKL can use for parallel runs \n\n", max_threads);printf (" Running Intel(R) MKL from 1 to %i threads \n\n", max_threads*2);for (i = 1; i <= max_threads*2; i++) {for (j = 0; j < (m*n); j++)C[j] = 0.0;mkl_set_num_threads(i);cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,m, n, p, alpha, A, p, B, n, beta, C, n);s_initial = dsecnd();for (r = 0; r < LOOP_COUNT; r++) {cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,m, n, p, alpha, A, p, B, n, beta, C, n);}s_elapsed = (dsecnd() - s_initial) / LOOP_COUNT;printf (" == Matrix multiplication using Intel(R) MKL dgemm completed ==\n"" == at %.5f milliseconds using %d thread(s) ==\n\n", (s_elapsed * 1000), i);}printf (" Deallocating memory \n\n");mkl_free(A);mkl_free(B);mkl_free(C);if (s_elapsed < 0.9/LOOP_COUNT) {s_elapsed=1.0/LOOP_COUNT/s_elapsed;i=(int)(s_elapsed*LOOP_COUNT)+1;printf(" It is highly recommended to define LOOP_COUNT for this example on your \n"" computer as %i to have total execution time about 1 second for reliability \n"" of measurements\n\n", i);}printf (" Example completed. \n\n");return 0;
}

运行结果如下,当mkl_get_max_threads等于physical cores数时,性能是最佳的,并不是线程数,也就是如下的4,而不是8:

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 94
Model name:            Intel(R) Core(TM) i7-6770HQ CPU @ 2.60GHz
Stepping:              3
CPU MHz:               1100.549
CPU max MHz:           3500.0000
CPU min MHz:           800.0000
BogoMIPS:              5184.00
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              6144K
NUMA node0 CPU(s):     0-7$ ./run_dgemm_threading_effect_example                                        This example demonstrates threading impact on computing real matrix productC=alpha*A*B+beta*C using Intel(R) MKL function dgemm, where A, B, and C arematrices and alpha and beta are double precision scalarsInitializing data for matrix multiplication C=A*B for matrixA(2000x200) and matrix B(200x1000)Allocating memory for matrices aligned on 64-byte boundary for betterperformanceIntializing matrix dataFinding max number 4 of threads Intel(R) MKL can use for parallel runsRunning Intel(R) MKL from 1 to 8 threads== Matrix multiplication using Intel(R) MKL dgemm completed ==== at 15.47987 milliseconds using 1 thread(s) ==== Matrix multiplication using Intel(R) MKL dgemm completed ==== at 8.00033 milliseconds using 2 thread(s) ==== Matrix multiplication using Intel(R) MKL dgemm completed ==== at 5.51243 milliseconds using 3 thread(s) ==== Matrix multiplication using Intel(R) MKL dgemm completed ==== at 4.68829 milliseconds using 4 thread(s) ==== Matrix multiplication using Intel(R) MKL dgemm completed ==== at 4.82797 milliseconds using 5 thread(s) ==== Matrix multiplication using Intel(R) MKL dgemm completed ==== at 4.83322 milliseconds using 6 thread(s) ==== Matrix multiplication using Intel(R) MKL dgemm completed ==== at 4.98721 milliseconds using 7 thread(s) ==== Matrix multiplication using Intel(R) MKL dgemm completed ==== at 4.76135 milliseconds using 8 thread(s) ==Deallocating memoryExample completed.





实战Intel MKL(Math Kernel Library)相关推荐

  1. Linux下安装intel数学库Math Kernel Library(MKL)

    一.下载 1.下载地址:https://software.intel.com/en-us/mkl/choose-download 2.点击红框: 3.点击红框: 4.填写相关信息后,会发送一封邮件,邮 ...

  2. 【神经网络与深度学习】【C/C++】比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能

    比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能 对于机器学习的很多问题来说,计算的瓶颈往往在于大规模以及频繁的矩阵运算,主要在于以下两方面: (Dense/Sparse) Matr ...

  3. Intel MKL基础(1)了解MKL、MKL资源

    Intel MKL:Intel Math Kernel Library,英特尔数学核心函数库. 下面是从英特尔网站上相关MKL的产品介绍页面等,可以用于初步了解MKL: Intel MKL产品介绍: ...

  4. Intel MKL FATAL ERROR Cannot load mkl_intel_thread.dll

    Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll 问题原因 错误警告 INTEL MKL ERROR: 找不到指定的模块. mkl_int ...

  5. aMDcpu不支持mysql_AMD黑苹果 使用numpy或pytorch或Adobe 报错Intel MKL ERROR: CPU 0 is not supported解决办法...

    日期:2020-11-04 macos版本:10.15.7 Python版本:anaconda python 3.8 CPU:AMD Ryzen5 3600 参考文档: http://bbs.pcbe ...

  6. 有效解决“INTEL MKL ERROR: 找不到指定的模块, mkl_intel_thread.dll. 或 Cannot load mkl_intel_thread.dll”

    错误提示内容: 近期在python导入numpy使用时,遇到了问题,如下: 错误警告: ___________________________________________ INTEL MKL ER ...

  7. Intel MKL库在VS中的配置与使用

    转载自https://blog.csdn.net/world_6520/article/details/84959233 自己留一波以防原作删除 主要是手动配置(一般编译器会自动配置好,如果没有配置, ...

  8. R构建径向核支持向量机分类器实战代码(Radial kernel Support Vector Classifier)

    R构建径向核支持向量机分类器实战代码(Radial kernel Support Vector Classifier) 目录 R构建径向核支持向量机分类器实战代码(Radial kernel Supp ...

  9. Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so.

    之前在运行一个文件时,发生了这个问题,排查了一下是wineModel = LassoCV(cv=10).fit(X, Y) 这行代码组成的. Intel MKL FATAL ERROR: Cannot ...

最新文章

  1. 根据txt中的文件名将文件复制到目标文件夹中
  2. 金融专有云数据安全实践
  3. 简单实现仿某宝地址选择三级联动样式
  4. Taro+react开发(67):数组中push返回的是长度
  5. 6 获取当前模块_python常用模块的常用方法介绍
  6. 除非万不得已,否则绝不谈判
  7. 微信小程序全面开放近一年,姗姗来迟的阿里还有胜局吗?| 畅言
  8. 蓝桥杯2016年第七届C/C++A组省赛第二题-生日蜡烛
  9. module_param()函数
  10. IEEE754-2008 标准详解(五):异常
  11. 10个CSS技巧,极大提升用户体验
  12. java查询手机号码归属地_Java代码总结【1】_查询手机号码归属地
  13. 【Pyecharts | Scatter】气泡图实现 / 1990 与 2015 年各国家人均寿命与GDP
  14. 贪心 汽车加油 java_贪心算法解汽车加油站问题
  15. 1055 习题4-9-3 逆序输出正整数各位上数字
  16. win7计算机名怎么是感叹号,Win7系统wifi信号后出现感叹号怎么办 Win7连接wifi后出现感叹号三种原因和解决方法...
  17. 简单实用的出入库管理系统,帮你实现库存精细化管理!
  18. 强烈安利一波,程序猿学习网站
  19. JAVA音视频解决方案----音频处理方案
  20. windows 定时重启

热门文章

  1. speedoffice(Excel)表格如何设置背景颜色?
  2. Unity3D URP中使用Render Feature实现后处理效果
  3. C# word 转换成pdf 并且修改其中控件内容
  4. 二.deepin安装软件(1)
  5. 基于tq6410的linux使用教程,基于tq6410的linux使用教程
  6. 排除计算机主机不启动故障,电喷发动机启动不着车的故障诊断和排除
  7. 6代u笔记本完美支持win7_还真别说intel 九代CPU都能重装win7|九代CPU完美支持win7
  8. Redis 队列好处
  9. 安川7伺服驱动器源码,Yaskawa7设计文档,原理图,上位机,说明书全套
  10. 2600评测_10寸真香电纸书 墨案Inkpad X评测