我一直在测试一个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) 很偶然地在内核丛林中偶然发现了一些代码并且有点困惑。有两种实现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 指针取消引用。这是一个错误还是我错过了什么?
当使用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++编写.他们将静态分配转换为动态,但没有编辑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) 得知两后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) 我正在编写一个驱动程序,要求我清除分配给零的所有内存.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) 我无法弄清楚以下两个实现之间究竟有什么区别:
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)
它们都产生以下结果:
输出:*****世界!
他们之间有偏好吗?
我有一个动态创建的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).我可以遍历每个项目并执行它.
但是有一种更简单的方法.我正在尝试使用memset并std::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 函数版本,当我到达时,memcpy我memset认为我应该将目标和源指针转换为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)