Administrator
发布于 2023-10-30 / 6 阅读 / 0 评论 / 0 点赞

10月30日😋

https://githubfast.com/834810071/NetworkProgramming.git

TBB

TBB官方文档

oneTBB Samples (intel.com)

BenchMark

CMake:作为子模块
set(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "Turn off the fking test!")

关闭该模块的测试,该测试会找一些程序

任务域tbb::task_arena
嵌套for

如果有锁,可能会出现死锁问题,对一个锁2遍

指定线程数
死锁问题和工作窃取
    size_t n = 1<<13;
    std::vector<float> a(n * n);
    std::mutex mtx;

    tbb::parallel_for((size_t)0, (size_t)n, [&] (size_t i) {
        std::lock_guard lck(mtx);
        tbb::parallel_for((size_t)0, (size_t)n, [&] (size_t j) {
            a[i * n + j] = std::sin(i) * std::sin(j);
        });
    });
	

?????????????真的吗??

std::recursive_mutex递归锁

递归锁是一种特殊类型的互斥锁,允许同一个线程多次获取同一个互斥锁而不会发生死锁。

任务域互相之间不会窃取线程
this_task_area::isolate

并行:如何均匀的分配任务到每个线程

解决方法1:线程超过cpu核心数

这时系统会时间片轮换在核心执行,让系统常用时间片轮换保证各个核心始终饱和。

缺点:时间片轮导致上下文切换频繁的格外开销

方法2:线程数=核数,用队列分发任务
方法3:工作窃取法

方法4:随机分配

任务切的更细,然后随机分配,只要数量够大,数学期望上就是每个线程工作量是均匀。

其他并行容器

并行筛选1
并行筛选2
并行3
并行5


c语言避坑

跨平台避免使用long类型


评论