小编Cur*_*ous的帖子

未使用的asm()在不支持的体系结构上的行为

asm()在未使用但不受支持的架构中,代码块的行为是什么?例如,如果我在ARM上编译以下代码会发生什么

if (false) {
    asm volatile("x86specificinstruction" ...);
}
Run Code Online (Sandbox Code Playgroud)

这是有效的C++吗?代码会编译吗?标准是否对此类情况有所说明?

c++ x86 assembly arm

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

强制将缓存行迁移到另一个核心

在用于x86硬件的C ++(使用平台上可用的任何低级内在函数)(例如Intel Skylake)中,是否可以将高速缓存行发送到另一个内核而无需强制该内核上的线程显式加载该行?

我的用例是在并发数据结构中。在这种情况下,在某些情况下,某个核心会在内存中经过某些地方,而这些地方可能在探寻斑点时由其他一些核心拥有。这些核心上的线程通常在条件变量中被阻塞,因此它们具有一些备用循环,可以在其中运行其他“有用的工作”。这里“有用的工作”的一个示例可能是它们将数据流式传输到另一个内核,该内核将在将来加载它们,因此加载内核不必在处理该行之前就等待该行进入其缓存。x86硬件上是否有一些可能的内在/指令可用?


__builtin_prefetch并不能很好地工作,因为出于某种原因,它最终将延迟添加回执行加载的代码中:(也许步幅配置不佳,但到目前为止我还没有取得很好的步幅。这可能会得到更好的处理,并且可以从确定最终会加载其行的其他内核确定地进行处理。

c++ concurrency x86 assembly cpu-cache

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

标记的联合C++

我试图在c ++文件中编译以下标记的联合,我遇到了问题.有人可以解释我缺少什么或我需要改变什么来让以下工作吗?我试过在网上看这个,不幸的是没有得到...

#include <string>
using std::string;
#include <iostream>
using std::cout;
using std::endl;
#include <new>

const int TU_STRING = 0;
const int TU_INT = 1;
const int TU_FLOAT = 2;

struct TU {
   int type;
   union {
     int i;
     float f;
     std::string s;
   } u;

   TU(const TU& tu) : type(tu.type) {
     switch (tu.type) {
       case TU_STRING: new(&u.s)(tu.u.s); break;
       case TU_INT:    u.i = tu.u.i;      break;
       case TU_FLOAT:  u.f = tu.u.f;      break;
     }
   }
   ~TU() {
     if (tu.type == TU_STRING)
       u.s.~string();
   }
}; …
Run Code Online (Sandbox Code Playgroud)

c++ clang unions c++14

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

通过覆盖C标准库调用来测量堆使用情况

参考以下代码

#include <cassert>
#include <vector>
#include <dlfcn.h>
#include <limits>
#include <map>
#include <algorithm>
#include <iostream>
using std::cout;
using std::endl;
using std::vector;

/*
 * Overload the malloc call
 */
int max_heap_usage = 0;
std::map<uintptr_t, int>& heap_memory_map;
void track_max_usage(std::map<uintptr_t, int> heap_memory_map, 
        int& max_heap_usage);

void* malloc(size_t size) {

    // get the original malloc function call
    static auto original_malloc = (decltype(&malloc)) dlsym(RTLD_NEXT, "malloc");

    // Get the pointer from malloc
    void* pointer = original_malloc(size);
    uintptr_t pointer_handle = reinterpret_cast<uintptr_t>(pointer);

    // assert that the pointer does not …
Run Code Online (Sandbox Code Playgroud)

c++ malloc dynamic-linking c++11 c++14

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

如何使用 bash 别名作为命令行参数

我在谷歌上查了一下这个问题,但之前似乎没有人问过这个问题。有没有办法可以设置别名并将其用作程序的命令行参数?

例如

ssh myserver
Run Code Online (Sandbox Code Playgroud)

并被myserver定义为我的服务器的IP地址

linux ssh bash shell alias

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

React.js 如何使用虚拟 DOM 加速渲染

引用这篇(https://news.ycombinator.com/item?id=9155564)文章

简短的回答是 DOM 并不慢。添加和删​​除 DOM 节点是一些指针交换,只不过是在 JS 对象上设置一个属性。

DOM 瓶颈只是那些导致重绘的东西吗?如果是这样,那么来自 React 的虚拟 DOM 的渲染是否应该摊销到与重绘整个组件相同的性能(当然是在一个浏览器 API 调用中)?我认为浏览器执行的算法只会尝试重新绘制从一种状态到另一种状态的差异(可能像 git?)。暗示浏览器自己维护一个虚拟 DOM。那么拥有虚拟 DOM 的意义何在?

还应该添加一个将displaystyle 属性设置为none不会严重影响性能的元素吗?我会自己对此进行分析,但我不知道该转向哪里,因为我最近才开始使用 JavaScript 编程。

html javascript jquery dom reactjs

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

为什么Go通道限制缓冲区大小

我是Go的新手,我可能会忽略这一点,但为什么Go通道限制在缓冲通道的最大缓冲区大小可以有?例如,如果我制作一个这样的频道

channel := make(chan int, 100)
Run Code Online (Sandbox Code Playgroud)

我不能在没有阻塞的情况下向频道添加超过100个元素,这有什么原因吗?此外,它们无法动态调整大小,因为通道API不支持它.

这似乎限制了语言支持单一机制的通用同步,因为与无界信号相比,它缺乏便利性.例如,可以无限制地增加广义信号量的值.

channel go goroutine

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

静态链接英特尔tbb的问题

我最近读了这个问题如何静态链接到TBB?我仍然不明白使用tbb作为静态链接库的问题(如果你这样做,可以使用它们的makefile make extra_inc=big_iron.inc tbb)

答案似乎是说问题在于单个程序中可能存在多个单例,单个子的所有(大多数?)实现都不会让这种情况发生.我不明白这背后的原因.

问题在于,当您进行fork()另一个处理时,单例会在两个单独的进程中成为两个独立的单例吗?那是"程序"的意思吗?如果就是这样,为什么他们不能mmap()共享内存并将其用作通信媒介?

也不动态链接只意味着库本身在内存中共享,即代码段?

谢谢!

c++ tbb dynamic-linking

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

为多个请求重用同一个套接字连接

这个问题可能有点偏离主题,但我不知道还能问哪里。我正在阅读此https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md并看到该规范包括能够使用相同的连接发送无序消息。

我之前进行TCP套接字编程的唯一方法是在套接字上同步发送请求,例如,我将打开一个套接字127.0.0.1,通过该套接字向该服务器发送请求并等待响应。当我收到所发送请求的响应时,我会在响应请求后通过调用close()客户端和close()服务器来关闭该连接。


作为背景,我正在开发一个 C++ 项目,libevent该项目要做的事情与 RPC 系统非常相似,所以我想知道我应该在底层传输系统中使用什么请求响应套接字周期。

在 C++ thrift 中,有一个名为open()(大概)的客户端方法,它打开一个连接并保持它打开状态,直到您调用close(). 这在被抽象出来的系统中如何工作?例如,在我上面包含的 messagepack-RPC 链接中。最好的做法是什么?如果没有连接,则打开一个连接,发送请求,并在所有先前的请求得到处理后关闭该连接(在服务器上,close()当所有挂起的请求都得到响应时调用)?或者我们是否必须以某种方式尝试使该连接在超出请求生命周期的一段时间内保持活动状态?服务器和客户端如何知道该时间段是多少?recv()例如,我们是否应该在套接字上注册一个读取事件处理程序并在返回时关闭连接0

如果这是一个不同系统以不同方式解决的问题,那么有人可以指导我找到一个资源,我可以使用该资源来读取保持连接活动的可能模式(最好是在事件驱动系统中)?例如,我读到 HTTP 服务器始终保持连接打开,这是为什么?保持每个连接打开是否意味着服务器本质上会泄漏内存?

抱歉,这个看似基本的问题,我以前只做过非常简单的 TCP 套接字编程,所以我可能不知道事情是如何完成的。

c++ sockets tcp libevent multiplexing

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

在Intel x86中读取缓存行与缓存行的一部分

这个问题可能没有确定的答案,但在这个领域寻找一般性的建议.如果这是偏离主题的,请告诉我.如果我的代码从不在当前CPU的L1缓存中的高速缓存行读取并且读取到远程高速缓存,则说该对象来自刚刚写入它的远程线程,因此具有修改模式的高速缓存行.读取整个缓存行与仅部分缓存行是否有任何增量成本?或者像这样的东西可以完全并行化吗?

例如,给定以下代码(假设foo()谎言是一些其他转换单元并且对优化器不透明,则不涉及LTO)

struct alignas(std::hardware_destructive_interference_size) Cacheline {
    std::array<std::uint8_t, std::hardware_constructive_interference_size> bytes;
};

void foo(std::uint8_t byte);
Run Code Online (Sandbox Code Playgroud)

这之间是否存在任何预期的性能差异

void bar(Cacheline& remote) {
  foo(remote.bytes[0]);
}
Run Code Online (Sandbox Code Playgroud)

还有这个

void bar(Cacheline& remote) {
    for (auto& byte : remote.bytes) {
        foo(byte);
    }
}
Run Code Online (Sandbox Code Playgroud)

或者这是什么东西很可能影响不大?在读取完成之前,整个高速缓存行是否转移到当前处理器?或者CPU可以并行读取和远程缓存行提取(在这种情况下,等待整个缓存行传输可能会产生影响)?


对于某些上下文:我处在一种情况,我知道可以将数据块设计为适合高速缓存行(压缩可能不会占用缓存未命中的CPU时间),或者可以压缩为了适应高速缓存行并尽可能紧凑,所以遥控器可以在不读取整个高速缓存行的情况下完成.两种方法都涉及截然不同的代码.试着找出我应该首先尝试哪一个以及一般建议在这里.

c++ performance x86 assembly caching

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