标签: memset

memset与绑定到每个物理核心的线程并行

我一直在测试一个OpenMP并行代码中的代码,memset并行运行会有什么好处吗?我正在观察一些意外的事情.

我的系统是一个单插槽Xeon E5-1620,它是一个Ivy Bridge处理器,有4个物理内核和8个超线程.我使用的是Ubuntu 14.04 LTS,Linux Kernel 3.13,GCC 4.9.0和EGLIBC 2.19.我编译gcc -fopenmp -O3 mem.c

当我在链接中运行代码时,它默认为八个线程并给出

Touch:   11830.448 MB/s
Rewrite: 18133.428 MB/s
Run Code Online (Sandbox Code Playgroud)

但是,当我绑定线程并将线程数设置为这样的物理核心数

export OMP_NUM_THREADS=4 
export OMP_PROC_BIND=true
Run Code Online (Sandbox Code Playgroud)

我明白了

Touch:   22167.854 MB/s
Rewrite: 18291.134 MB/s
Run Code Online (Sandbox Code Playgroud)

触控率增加了一倍!绑定后运行几次总是比重写更快.我不明白这一点.绑定线程并将其设置为物理核心数后,为什么触摸比重写更快?为什么触控率翻倍?

这是我使用的代码,没有修改Hristo Iliev的答案.

#include <stdio.h>
#include <string.h>
#include <omp.h>

void zero(char *buf, size_t size)
{
    size_t my_start, my_size;

    if (omp_in_parallel())
    {
        int id = omp_get_thread_num();
        int num = omp_get_num_threads();

        my_start = (id*size)/num;
        my_size = ((id+1)*size)/num - my_start;
    }
    else
    {
        my_start = 0;
        my_size …
Run Code Online (Sandbox Code Playgroud)

parallel-processing multithreading sse openmp memset

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

来自 kzalloc 的 memset 中的 Linux 内核空指针取消引用

很偶然地在内核丛林中偶然发现了一些代码并且有点困惑。有两种实现kzalloc():在tools/virtio/linux/kernel.h 中,主要的在linux/slab.h 中。显然,在大多数情况下,使用第二个。但有时使用“virtio” kzalloc()

“virtio”kzalloc()看起来像这样:

static inline void *kzalloc(size_t s, gfp_t gfp)
{
    void *p = kmalloc(s, gfp);

    memset(p, 0, s);
    return p;
}
Run Code Online (Sandbox Code Playgroud)

我的困惑是kmalloc()在“tools”目录中使用的“fake”会返回 NULL 指针。此外,该memset()实现似乎不检查 NULL 指针,因此可能存在 NULL 指针取消引用。这是一个错误还是我错过了什么?

c linux memset linux-kernel kmalloc

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

char数组与char指针

当使用recv通过套接字接收数据时,我注意到了:

char buffer[4];
memset(buffer, 0, 4);
recv(socket, buffer, 4, 0);

我收到

mesgx

"mesg"是我发送的内容,附加了一些随机字符.

如果我使用

char * method = (char *) malloc(4);
memset(buffer, 0, 4);
recv(socket, buffer, 4, 0);

相反,我收到了

MESG

所以我的字符串中没有附加的随机内容.我想出如果我使用char [5]而不是它也可以,但我真的不明白为什么.malloc(4)真的分配了5个字节,第五个是NUL吗?

c malloc c-strings memset

6
推荐指数
2
解决办法
4506
查看次数

在C++中使用结构上的memset

大家好.我正在为我的工作修复旧代码.它目前用C++编写.他们将静态分配转换为动态,但没有编辑memsets/memcmp/memcpy.这是我的第一次编程实习,因为我的类似于newbe的问题.

下面的代码在C中,但我希望在C++中使用它(我读过malloc在C++中不是很好的做法).我有两个场景:首先,我们创建了f.然后使用&f以填充零.第二个是指针*pf.我不确定如何将pf设置为全部0,就像前面的C++示例一样.

你可以pf = new foo代替malloc然后打电话memset(pf, 0, sizeof(foo))吗?

struct foo { ... } f;
memset( &f, 0, sizeof(f) );

//or

struct foo { ... } *pf;
pf = (struct foo*) malloc( sizeof(*pf) );
memset( pf, 0, sizeof(*pf) );
Run Code Online (Sandbox Code Playgroud)

c++ memset memcmp

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

C奇怪的数组行为

得知两后strncmp是不是它似乎并strlcpy没有被使用我的操作系统(Linux)的,我想我可以尝试,并将其写入自己.

我发现了libc维护者Ulrich Drepper的一句话,他发布了另一种strlcpy使用方法mempcpy.我也没有mempcpy,但它的行为很容易复制.首先,这是我的测试用例

#include <stdio.h>
#include <string.h>

#define BSIZE 10

void insp(const char* s, int n)
{
   int i;

   for (i = 0; i < n; i++)
      printf("%c  ", s[i]);

   printf("\n");

   for (i = 0; i < n; i++)
      printf("%02X ", s[i]);

   printf("\n");

   return;
}

int copy_string(char *dest, const char *src, int n)
{
   int r = strlen(memcpy(dest, src, n-1));
   dest[r] = 0;

   return r;
}

int main()
{
   char …
Run Code Online (Sandbox Code Playgroud)

c arrays memset memcpy

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

与memset函数等效的Linux内核是什么?

我正在编写一个驱动程序,要求我清除分配给零的所有内存.memset是一个用户空间函数,但我想知道内核是否提供了一个可以帮助我做到这一点的宏.

c kernel driver memset linux-kernel

6
推荐指数
2
解决办法
1万
查看次数

我在64位机器上优化memset的尝试比标准实现花费更多时间.有人可以解释一下原因吗?

(机器是x86 64位运行SL6)

我试图看看我是否可以在我的64位机器上优化memset.根据我的理解,memset逐字节地设置并设置值.我假设如果我以64位为单位,它会更快.但不知何故需要更多时间.有人可以看看我的代码并提出原因吗?

/* Code */
#include <stdio.h>
#include <time.h>
#include <stdint.h>
#include <string.h>

void memset8(unsigned char *dest, unsigned char val, uint32_t count)
{
    while (count--)
        *dest++ = val;
}
void memset32(uint32_t *dest, uint32_t val, uint32_t count)
{
    while (count--)
        *dest++ = val;
}
void
memset64(uint64_t *dest, uint64_t val, uint32_t count)
{
    while (count--)
        *dest++ = val;
}
#define CYCLES 1000000000
int main()
{
    clock_t start, end;
    double total;
    uint64_t loop;
    uint64_t val;

    /* memset 32 */
    start = clock(); …
Run Code Online (Sandbox Code Playgroud)

c 64-bit memset

6
推荐指数
2
解决办法
2161
查看次数

memset和_strnset之间的区别

我无法弄清楚以下两个实现之间究竟有什么区别:

char str[20] = "Hello World";
_strnset(str, '*', 5); 
Run Code Online (Sandbox Code Playgroud)

char str[20] = "Hello World";
memset(str, '*', 5);
Run Code Online (Sandbox Code Playgroud)

它们都产生以下结果:

输出:*****世界!

他们之间有偏好吗?

c c++ memset

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

如何使用memset或fill_n在C++中初始化动态二维数组

我有一个动态创建的2D数组.

int **abc = new int*[rows];

for (uint32_t i = 0; i < rows; i++)
{
    abc[i] = new int[cols];
}
Run Code Online (Sandbox Code Playgroud)

我想用一些值填充数组(比如说1).我可以遍历每个项目并执行它.

但是有一种更简单的方法.我正在尝试使用memsetstd::fill_n本文中提到.

std::fill_n(abc, rows * cols, 1);
memset(abc, 1, rows * cols * sizeof(int));
Run Code Online (Sandbox Code Playgroud)

使用memset会崩溃我的程序.使用fill_n会产生编译错误.

invalid conversion from 'int' to 'int*' [-fpermissive]
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

c++ memset multidimensional-array dynamic-arrays

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

作业:创建我自己的memcpy。为什么将目标和源指针转换为 unsigned char* 而不是 char*?

我正在尝试创建我自己的 C 函数版本,当我到达时,memcpymemset认为我应该将目标和源指针转换为char *. 然而,我见过很多指针被转换到的例子unsigned char *。这是为什么?

void *mem_cpy(void *dest, const void *src, size_t n) {

    if (dest == NULL || src == NULL)
        return NULL;
    int i = 0;
    char *dest_arr = (char *)dest;
    char *src_arr = (char *)src;
    while (i < n) {
        dest_arr[i] = src_arr[i];
        i++;
    }
    return dest;
}
Run Code Online (Sandbox Code Playgroud)

c memset memcpy

6
推荐指数
2
解决办法
384
查看次数