并发编程(c++)——2.1线程池在cpu密集任务中的应用 本文主要介绍线程池在cpu密集任务中的应用通过分治思想将任务分解成多个小任务将每个小任务放在线程池中不同线程中主要强调了线程数量在cpu密集计算中的作用并通过矩阵计算作为案例。背景生产任务中存在大量的密集计算需求如科学计算、大数据计算、人工智能等场景。问题如何将并发编程应用到cpu密集任务中提高计算速度。方案分治思想线程池。cpu密集任务需要将完整任务分解成可以并行的小任务将每个小任务放在线程池中不同线程中最后综合结果.在这个过程中一直在使用cpu计算能力如果一个核心上同时存在运行多个小任务此时就会出现线程切换这会带来多余的上下文切换降低处理速度。所以在分配线程池的时候需要将线程数和逻辑核心数保持一致这样就可以避免线程切换提高处理速度。案例计算矩阵的和大型矩阵的元素和计算是一个典型的cpu密集任务将矩阵分解成多个小矩阵每个小矩阵计算和最后将所有小矩阵的和相加得到最终结果。实现1.创建一个矩阵// 创建一个矩阵std::vectorstd::vectorfloatcreate_matrix(intn,intm){std::vectorstd::vectorfloatmatrix(n,std::vectorfloat(m));for(inti0;in;i){for(intj0;jm;j){matrix[i][j]1;}}returnmatrix;}2.计算一个块的和// 求和矩阵的块doubleblock_sum(std::vectorstd::vectorfloatmatrix,intbolck_size,inti,intj){//提取矩阵的块floatsum0;for(intk0;kbolck_size;k){for(intl0;lbolck_size;l){sumsummatrix[i*bolck_sizek][j*bolck_sizel];}}returnsum;}3.对比并发计算和串行计算的速度线程池的功能来自于并发编程c——2.线程池模式voidtest_cpu(){// 初始化线程池size_t cpu_coresstd::thread::hardware_concurrency();intthread_countscpu_cores*2;std::coutcpu cores: cpu_coresstd::endl;ThreadPoolpool(thread_counts);// 定义矩阵的行数和列数均为1024intn100000,m10000;// 调用create_matrix函数创建一个n行m列的二维浮点数矩阵std::vectorstd::vectorfloatmatrixcreate_matrix(n,m);// 1.直接求和autot1std::chrono::high_resolution_clock::now();doublesum0;for(autorow:matrix){for(autoval:row){sumval;}}autot2std::chrono::high_resolution_clock::now();std::chrono::durationdoubletime_spanstd::chrono::duration_caststd::chrono::durationdouble(t2-t1);std::cout矩阵直接求和的结果: sumstd::endl;std::coutTime: time_span.count()sstd::endl;// 2.分治求和autot3std::chrono::high_resolution_clock::now();std::vectorstd::futuredoublefutures;intbolck_size100;for(inti0;in/bolck_size;i){for(intj0;jm/bolck_size;j){// std::couti: i j: jstd::endl;// 分块线程池运算futures.push_back(pool.enqueue([matrix,bolck_size,i,j](){returnblock_sum(matrix,bolck_size,i,j);}));}}// 等待所有任务完成std::vectordoubleresults;for(autofuture:futures){results.push_back(future.get());// std::coutresult: future.get()std::endl;}// 求和sum0;for(autoval:results){sumval;}autot4std::chrono::high_resolution_clock::now();time_spanstd::chrono::duration_caststd::chrono::durationdouble(t4-t3);std::cout矩阵分治求和的结果: sumstd::endl;std::coutTime: time_span.count()sstd::endl;}运算结果cpu cores:20矩阵直接求和的结果:1e09Time:1.87203s 矩阵分治求和的结果:1e09Time:0.797735s并发计算的速度是串行计算的2倍左右。总结并发编程能够提高cpu密集任务的处理速度核心思想是分治思想线程池但是需要合理分配线程池避免线程切换带来的性能损失。