相关疑难解决方法(0)

为什么malloc + memset比calloc慢?

众所周知,它与初始化分配的内存calloc不同malloc.使用时calloc,内存设置为零.使用时malloc,内存不会被清除.

所以在日常工作中,我认为callocmalloc+ memset.顺便说一下,为了好玩,我为基准编写了以下代码.

结果令人困惑.

代码1:

#include<stdio.h>
#include<stdlib.h>
#define BLOCK_SIZE 1024*1024*256
int main()
{
        int i=0;
        char *buf[10];
        while(i<10)
        {
                buf[i] = (char*)calloc(1,BLOCK_SIZE);
                i++;
        }
}
Run Code Online (Sandbox Code Playgroud)

代码1的输出:

time ./a.out  
**real 0m0.287s**  
user 0m0.095s  
sys 0m0.192s  
Run Code Online (Sandbox Code Playgroud)

代码2:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BLOCK_SIZE 1024*1024*256
int main()
{
        int i=0;
        char *buf[10];
        while(i<10)
        {
                buf[i] = (char*)malloc(BLOCK_SIZE);
                memset(buf[i],'\0',BLOCK_SIZE);
                i++;
        }
}
Run Code Online (Sandbox Code Playgroud)

代码2的输出:

time ./a.out   
**real 0m2.693s**  
user 0m0.973s  
sys 0m1.721s  
Run Code Online (Sandbox Code Playgroud)

更换 …

c malloc

249
推荐指数
2
解决办法
5万
查看次数

更快地检查C中的全零缓冲区的方法?

我正在寻找一种更快的方法来完成这个:

int is_empty(char * buf, int size) 
{
    int i;
    for(i = 0; i < size; i++) {
        if(buf[i] != 0) return 0;
    }
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

我意识到我正在寻找一种微观优化,除非在极端情况下,但我知道存在更快的方法,我很好奇它是什么.

c optimization performance buffer

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

使用C/Intel程序集,测试128字节内存块是否包含全零的最快方法是什么?

继续我的第一个问题,我正在尝试优化通过VTune分析64位C程序找到的内存热点.

特别是,我想找到一种最快的方法来测试一个128字节的内存块是否包含全零.您可以假设内存块有任何所需的内存对齐方式; 我使用64字节对齐.

我正在使用配备Intel Ivy Bridge Core i7 3770处理器和32 GB内存的PC以及免费版的Microsoft vs2010 C编译器.

我的第一次尝试是:

const char* bytevecM;    // 4 GB block of memory, 64-byte aligned
size_t* psz;             // size_t is 64-bits
// ...
// "m7 & 0xffffff80" selects the 128 byte block to test for all zeros
psz = (size_t*)&bytevecM[(unsigned int)m7 & 0xffffff80];
if (psz[0]  == 0 && psz[1]  == 0
&&  psz[2]  == 0 && psz[3]  == 0
&&  psz[4]  == 0 && psz[5]  == 0
&&  psz[6]  == 0 …
Run Code Online (Sandbox Code Playgroud)

c optimization performance assembly intel-vtune

15
推荐指数
2
解决办法
2501
查看次数

是否可以通过mmap的匿名内存"打孔"?

考虑一个使用大量页面大小的内存区域(比如64 kB左右)的程序,每个区域都是相当短暂的.(在我的特定情况下,这些是绿色线程的备用堆栈.)

如何最好地分配这些区域,以便一旦该区域不再使用,它​​们的页面可以返回到内核?天真的解决方案显然只是mmap单独的每个区域,munmap一旦我完成它们就会再次出现.不过,我觉得这是一个坏主意,因为它们有很多.我怀疑VMM可能会在一段时间后开始严重缩放; 但即使没有,我仍然对理论案例感兴趣.

如果我只是mmap自己一个巨大的匿名映射,我可以根据需要分配区域,有没有办法通过映射"打孔"我已完成的区域?有点像madvise(MADV_DONTNEED),但不同之处在于应该将页面视为已删除,以便内核实际上不需要将其内容保留在任何位置,但只要再次出现故障就可以重用已归零的页面.

我正在使用Linux,在这种情况下,我并不打算使用特定于Linux的调用.

c linux mmap

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

在二维数组中查找非零索引和值的更好方法

我仍在与在密集单精度Fortran 排序的二维数组中查找非零条目的索引(和相应值)i的问题作斗争。我通过 Python 使用 Cython,中间有一些 C。j

我提前道歉,因为这篇文章将会非常长。

介绍

我必须处理数千个(有时数百万个)中型 2D 数组(有时 700 x 1,000,有时 6,000 x 7,000 等等),这些数组非常稀疏,但它们提供为密集的(密度可以低至 0.02% 和高达 1-2%)。这些矩阵有时具有某种结构,但通常这是不可预测的。

我尝试过 numpy.nonzero 和 Scipy稀疏的东西,但不幸的是它们比我的慢。

我问这个问题是为了看看我的(可能不正确的)代码的性能是否有可能改进- 即,使其更快 - 而且也可以从更有经验的人那里学习新东西。

我对 Cython 的熟练程度非常有限。我对 C 的了解很糟糕(实际上几乎为零)。我所知道的关于 SIMD 指令的一切都可以用大字写在邮票上。

我在 StackOverflow 上来回搜索并找到了类似问题的答案,其中许多问题都使用了非常先进的 SIMD 解决方案。但由于我对 SIMD 一无所知,因此我无法修改它们以满足我的需要。

配置

  • Windows 10 64 位(Skylake AVX512,但我还应该瞄准 Icelake-client 和 Alderlake,可能还有其他一些)
  • Python 3.9.11 64 位
  • 赛通 0.29.32,NumPy 1.21.5
  • GCC 11.2.0(如果需要,我可以转到 GCC 12)

我使用这些标志编译下面发布的 Cython 脚本:

-O3 -ffast-math -funroll-loops -ftree-vectorize …
Run Code Online (Sandbox Code Playgroud)

c python gcc simd cython

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

标签 统计

c ×5

optimization ×2

performance ×2

assembly ×1

buffer ×1

cython ×1

gcc ×1

intel-vtune ×1

linux ×1

malloc ×1

mmap ×1

python ×1

simd ×1