小编muu*_*lla的帖子

将字段中的位扩展为掩码中所有(重叠+相邻)设置位的最快方法?

假设我有两个名为IN和MASK的二进制输入。实际字段大小可能是32到256位,具体取决于用于完成任务的指令集。两个输入都会更改每个呼叫。

Inputs:
IN   = ...1100010010010100...
MASK = ...0001111010111011...
Output:
OUT  = ...0001111010111000...
Run Code Online (Sandbox Code Playgroud)

编辑:来自一些评论讨论的另一个示例结果

IN   = ...11111110011010110...
MASK = ...01011011001111110...
Output:
OUT  = ...01011011001111110...
Run Code Online (Sandbox Code Playgroud)

我想获得1位IN所在的MASK的连续相邻1位。(是否有这种操作的总称?也许我没有适当地称呼我的搜索词。)我正在尝试找到一种更快的方法。我愿意使用任何x86或x86 SIMD扩展,这些扩展都可以在最少的cpu周期内完成。首选更广泛的数据类型SIMD,因为它将使我能够立即处理更多数据。

我想出的最好的天真解决方案是以下伪代码,该伪代码手动向左移,直到没有更多匹配的位,然后向右重复:

// (using the variables above)
testL = testR = OUT = (IN & MASK);

LoopL:
testL = (testL << 1) & MASK;
if (testL != 0) {
    OUT = OUT | testL;
    goto LoopL;
}

LoopR:
testR = (testR >> 1) & MASK;
if (testR != 0) {
    OUT = OUT | testR;
    goto …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly sse avx

12
推荐指数
2
解决办法
324
查看次数

如何在Linux内核模块中分配由1GB HugePages支持的DMA缓冲区?

我正在尝试为HPC工作负载分配DMA缓冲区.它需要64GB的缓冲空间.在计算之间,一些数据被卸载到PCIe卡.我没有将数据复制到pci_alloc_consistent给出的一堆极小的4MB缓冲区中,而是想创建64个1GB缓冲区,由1GB HugePages支持.

一些背景信息:内核版本:CentOS 6.4/2.6.32-358.el6.x86_64内核启动选项:hugepagesz = 1g hugepages = 64 default_hugepagesz = 1g

/ proc/meminfo的相关部分:AnonHugePages:0 kB HugePages_Total:64 HugePages_Free:64 HugePages_Rsvd:0 HugePages_Surp:0 Hugepagesize:1048576 kB DirectMap4k:848 kB DirectMap2M:2062336 kB DirectMap1G:132120576 kB

我可以挂载-t hugetlbfs nodev/mnt/hugepages.CONFIG_HUGETLB_PAGE为true.MAP_HUGETLB已定义.

我已经阅读了一些关于使用libhugetlbfs在用户空间中调用get_huge_pages()的信息,但理想情况下,这个缓冲区将在内核空间中分配.我尝试用MAP_HUGETLB调用do_mmap()但它似乎没有改变自由大页面的数量,所以我认为它实际上不是用大页面支持mmap.

所以我想我得到的是,有什么方法可以将缓冲区映射到内核空间中的1GB HugePage,还是必须在用户空间中完成?或者,如果有人知道任何其他方式,我可以获得一个巨大的(1-64GB)数量的连续物理内存可用作内核缓冲区?

c linux linux-kernel dma huge-pages

8
推荐指数
1
解决办法
3802
查看次数

在新的 Thread() 中等待是没有意义的吗?

示例代码:

    class Program
    {
        static void sleepFunc()
        {
            int before = Thread.CurrentThread.ManagedThreadId;
            Thread.Sleep(5000);
            int after = Thread.CurrentThread.ManagedThreadId;
            Console.WriteLine($"{before} -> sleep -> {after}");
        }

        static async void delayFunc()
        {
            int before = Thread.CurrentThread.ManagedThreadId;
            await Task.Delay(5000);
            int after = Thread.CurrentThread.ManagedThreadId;
            Console.WriteLine($"{before} -> delay -> {after}");
        }
        static void Main(string[] args)
        {
            List<Thread> threads = new List<Thread>();
            for(int i = 0; i < 10; i++)
            {
                var thread = new Thread(sleepFunc);
                thread.Start();
                threads.Add(thread);
            }
            Thread.Sleep(1000); // just to separate the result sections
            for …
Run Code Online (Sandbox Code Playgroud)

c# multithreading asynchronous async-await

1
推荐指数
1
解决办法
79
查看次数

标签 统计

c ×2

assembly ×1

async-await ×1

asynchronous ×1

avx ×1

c# ×1

dma ×1

huge-pages ×1

linux ×1

linux-kernel ×1

multithreading ×1

sse ×1

x86 ×1