我想知道为什么linux内核(或任何其他主流操作系统)没有零拷贝网络功能的原因?零拷贝我的意思是,数据包/数据流不会被复制以传递给用户空间中的应用程序,但是例如使用内存池类型的分配器来共享内核和用户空间之间的内存.我自己想出了3个理论:
a)我猜有安全问题.但当它们仅用作缓冲区时,是否真的没有办法在用户空间和内核之间安全地共享内存?
b)我猜有稳定性问题.但我们不能假设谁使用零拷贝网络,例如需要实例化并为内核调用传递内存池,是否知道内存管理?意识到足以避免泄漏?
c)到目前为止还没有完成/需要.我无法想象没有人要求这个功能,因为每个使用小数据包大小的人通常会受到"慢速"TCP堆栈实施的瓶颈,并且有第三方工具提供用于0-copy网络以供特殊使用网卡.
随意发布任何猜测,但请注明您是否正在假设或更深入了解保持StackOverflow质量的原因:-)
我一直想知道为什么AVX2提供的16x256位寄存器在AVX无法帮助时不会用于存储普通寄存器 - 在没有足够的寄存器的情况下最小化高速缓存的命中.您是否可以在1-2周期内设置和访问AVX寄存器?
如果你搞砸运行AVX的其他代码并将其从寄存器中删除,那么当然这一切都行不通.我还没有看到这种明显的方法被使用,这导致我提出这个问题.
我目前正在研究是否有可能加速面包车Emde Boas(或任何树)遍历.给定单个搜索查询作为输入,已经在缓存行中具有多个树节点(van emde Boas布局),树遍历似乎是指令瓶颈.
作为SIMD/AVX/SSE指令的新手,我想知道该主题的专家是否可以将多个节点一次比较到一个值,然后找出要进一步遵循的树路径.我的研究得出以下问题:
在构建SIMD/AVX/SSE寄存器等时浪费了多少cpu周期/指令.如果构建比手动遍历整个子树需要更多的时间(2 + 4 + 8个节点),这将使其用于wayne. 1个大小为64字节的高速缓存行).
在寻找合适的SIMD/AVX/SSE寄存器时,浪费了多少cpu周期/指令,并确定了要遵循的路径?任何人都可以想出一个聪明的方法,以便那些"findMinimumInteger"AVX指令可用于决定1(??)cpu周期?
你猜怎么着?
加速树遍历的另一种更棘手的方法是在最后一个树级别中很可能在节点中紧密地着陆时,同时运行多个搜索查询.对此有何猜测?但是,它必须将那些不再属于同一子树的查询放在一边,然后在完成树的第一次"并行遍历"之后递归地找到它们.树查询具有顺序但不是恒定的访问模式(query [i]总是<而不是查询[i + 1]).
重要的是:这个东西是关于整数树的,这就是使用van Emde Boas Tree的原因(也许x-fast/y-fast稍后尝试)
我很好奇你在这个问题上的50美分是多少,因为人们可能会对大型树的最高性能感兴趣.提前感谢你花时间在这上面:-)
对于利用缓存行预取(reading _next_ cacheline便宜)的树形布局,我需要以非常快的方式解决地址计算.我能够将问题归结为:
newIndex = nowIndex + 1 + (localChildIndex*X)
Run Code Online (Sandbox Code Playgroud)
x将是例如:X = 4 5 + 4 4 + 4 3 + 4 2 +4 0.
注意:4是分支因子.实际上它将是16,所以2的幂.这对于使用按位的东西应该是有用的吗?
如果它需要一个循环来计算X(performancewise)和像分区/乘法这样的东西,那将是非常糟糕的.这似乎是一个有趣的问题,我无法想出一些很好的计算方法.
由于它是树遍历的一部分,因此可以使用2种模式:绝对计算,独立于先前计算和增量计算,增量计算以高X保存在变量中开始,然后使用树的每个更深层次对其进行一些最小化处理.
我希望我能说清楚数学应该做什么.不确定是否有办法快速且没有循环 - 但也许有人可以提出一个非常聪明的解决方案.我要感谢大家的帮助 - StackOverflow过去对我来说是一位很棒的老师,我希望将来能够回馈更多,因为我的知识增加了.
从我的另一个问题"使用SIMD AVX SSE进行树遍历"我得到了这个代码,我试图进行基准测试.我之前没有做任何关于SIMD的事情,所以我对这种排列的东西有点新意.首先,让我们看看这段代码:
__m256i const perm_mask = _mm256_set_epi32(7, 6, 3, 2, 5, 4, 1, 0);
// compare the two halves of the cache line.
__m256i cmp1 = _mm256_load_si256(&node->m256[0]);
__m256i cmp2 = _mm256_load_si256(&node->m256[1]);
cmp1 = _mm256_cmpgt_epi32(cmp1, value); // PCMPGTD
cmp2 = _mm256_cmpgt_epi32(cmp2, value); // PCMPGTD
// merge the comparisons back together.
//
// a permute is required to get the pack results back into order
// because AVX-256 introduced that unfortunate two-lane interleave.
//
// alternately, you could pre-process …Run Code Online (Sandbox Code Playgroud) 我总是渴望了解最极端的性能优化.最近,我一直在考虑开发大型寄存器.当我在64位寄存器中获得一位信息时,我感到内疚...所以我想知道如何一次比较多个16位的技巧(例如有用的时候很有可能没有)或类似的.对于检查至少一个元素是否设置了标志的最简单的例子是将这些64位与0寄存器进行xor并将其比较为> 0.在指令级别上,这将会利用instr.管道,但无论如何你只需要2个指令而不是128个(每个mov和cmp).多数民众赞成我称之为惊人的加速!
我知道缓存未命中是我们的cpus花费95%的时间,但我们假设缓存使用已经是最佳的.
特别是对于树,一次比较没有SIMD的多个值并获得单个childIndex以便下一步读取将是有用的.最后,指令应该最小化,并且不要因管道等待惩罚而受到太多损失.
我可以列出的其他操作:
当使用填充(例如5x11位)彼此相邻时,您可以并行执行5次加法,移位,减法和按位运算.或7x 8位.Ofc,需要以这种方式存储数据并有效地使用结果,而不会对位掩码提取/导入进行惩罚.
assembly ×4
avx ×3
sse ×3
optimization ×2
performance ×2
simd ×2
c ×1
hpc ×1
linux ×1
linux-kernel ×1
math ×1
networking ×1
permutation ×1
zero-copy ×1