在新的语言标准中,C++ 11出现了关键字constexpr.
新标准C11(不是C++ 11)中是否有constexpr或未来计划?
在本文中:http://www.drdobbs.com/parallel/volatile-vs-volatile/212701484?
pgno = 2说,我们无法进行任何优化volatile,甚至如(where :) volatile int& v = *(address);:
v = 1; // C: write to v
local = v; // D: read from v
Run Code Online (Sandbox Code Playgroud)
无法对此进行优化:
v = 1; // C: write to v
local = 1; // D: read from v // but it can be done for std::atomic<>
Run Code Online (Sandbox Code Playgroud)
这是无法做到的,因为第1行和第2行之间的v值可能会被硬件设备改变(不是CPU不能工作缓存一致性:网络适配器,GPU,FPGA等...)(顺序/并发),映射到此内存位置.但是只有当v不能在CPU缓存L1/2/3中缓存时才有意义,因为对于volatile第一行和第二行之间的通常(非)变量太小的时间并且可能触发缓存.
volatile限定符是否保证不对此内存位置进行缓存?
回答:
volatile 不保证没有缓存此内存位置,并且在C/C++标准或编译器手册中没有任何相关内容.我不能在函数中使用constexpr值,而不是函数外部.
我可以auto ar1 = std::array<int, il.size()>();在il定义的范围内使用.
但我不能使用{ return std::array<T, il.size()>();}in constexpr-functionil_to_array()
为什么我不能在函数中使用constexpr值,但我可以在此值的块范围内执行相同的操作?
#include <iostream>
#include <initializer_list>
#include <array>
constexpr size_t size_to_size(size_t v) { return v; } // 1 - OK
template<typename T>
constexpr size_t il_to_size(std::initializer_list<T> il) { return il.size(); } // 2 - OK
// 3 - error
template<typename T>
constexpr auto il_to_array(std::initializer_list<T> il) {return std::array<T, il.size()>();}
template<size_t N>
void print_constexpr() { std::cout << N << std::endl; }
int main() { …Run Code Online (Sandbox Code Playgroud) 标准C++ 11是否保证std::async(std::launch::async, func)在单独的线程中启动功能?
工作草案,编程语言标准C++ 2016-07-12:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf
1.一方面,C++ 11-Standard表示如果无法创建线程,则会出现错误.这确保了创建新线程(没有错误).
§30.6.8
6
抛出:system_error如果 policy == launch :: async并且实现无法启动新线程.
7错误条件:
(7.1) - resource_unavailable_try_again - 如果 policy == launch :: async且系统无法启动新线程.
文档说:http://en.cppreference.com/w/cpp/thread/launch
std :: launch :: async启动新线程以异步执行任务
2.在另一方面,它被写入该线程可以被潜在地创建.那些,不一定要创建线程.
§30.6.8
1函数模板async提供了一种机制,可以在新线程中启动函数,并在与其共享共享状态的未来对象中提供函数的结果.
这里写的好像在一个新的线程中,它是否意味着在新的单独线程中没有必要?
§30.6.8
(3.1)
- 如果policy&launch :: async非零 - 调用INVOKE(DECAY_COPY(std :: forward(f)),DECAY_COPY(std :: forward(args))...)(20.14.2,30.3.1.2)好像在一个新的执行线程中,由一个线程对象表示调用DECAY_COPY()在调用async的线程中进行评估.任何返回值都作为结果存储在共享状态中.从执行INVOKE(DECAY_COPY(std :: forward(f)),DECAY_COPY(std :: forward(args))...)传播的任何异常都作为异常结果存储在共享状态中.线程对象存储在共享状态中,并影响引用该状态的任何异步返回对象的行为.
使用时std::async(std::launch::async, func) …
在Boost中有3个具有手动低延迟上下文切换的细线程:
Coroutine1,Coroutine2和Boost中的Fiber之间有什么区别?
正如我们从C11-memory_order所知道的那样:http://en.cppreference.com/w/c/atomic/memory_order
从C++ 11-std :: memory_order开始:http://en.cppreference.com/w/cpp/atomic/memory_order
在强排序系统(x86,SPARC,IBM大型机)上, 发布 - 获取顺序是自动的.没有为此同步模式发出额外的CPU指令,只会影响某些编译器优化(例如,禁止编译器在原子存储释放之前移动非原子存储或在原子载荷获取之前执行非原子加载)
但这对于x86-SSE指令是否正确(除了[NT] - 非时间,我们总是必须使用L/S/MFENCE)?
这里说,"sse指令......不要求向后兼容性,并且内存顺序未定义".据信,当需要时,严格的可订购性与旧版本的处理器x86兼容,但是新的命令,即SSE(除了[NT]) - 被剥夺了自动释放 - 获取订单,是吗?
正如已知的CPU是管道,如果命令序列彼此独立,它的工作效率最高 - 这称为ILP(指令级并行):http://en.wikipedia.org/wiki/Instruction-level_parallelism
但是有没有一个真正有效的例子,它显示了ILP的好处,至少是同步的例子,对于CPU x86_64(但在两种情况下都是相同数量的cmp/jne)?
我将编写以下示例 - 添加数组的所有元素,但它没有显示ILP的任何优点:http://ideone.com/fork/poWfsm
for(i = 0; i < arr_size; i += 8) {
result += arr[i+0] + arr[i+1] +
arr[i+2] + arr[i+3] +
arr[i+4] + arr[i+5] +
arr[i+6] + arr[i+7];
}
Run Code Online (Sandbox Code Playgroud)
register unsigned int v0, v1, v2, v3;
v0 = v1 = v2 = v3 = 0;
for(i = 0; i < arr_size; i += 8) {
v0 += arr[i+0] + …Run Code Online (Sandbox Code Playgroud) 众所周知,有两种方法可以避免高负载网络中的硬件中断的一些开销,当硬件中断太多时,切换到它们需要花费太多时间.对于程序风格的性能和选择方法非常重要.
http://en.wikipedia.org/wiki/New_API 内核可以定期检查传入网络数据包的到达而不会中断,从而消除了中断处理的开销.
https://en.wikipedia.org/wiki/Interrupt_coalescing一种技术,在这种技术中,通常会触发硬件中断的事件会被阻止,直到一定量的工作挂起或超时计时器触发为止.
两种方法都没有显着的中断成本 - 这是默认中断驱动模式的优势.
但第二种方法 - 中断合并更合理,因为它:
减少延迟 - 一旦程序包到达,立即尝试立即处理它,如果最近发生了中断,则立即轮询它.NAPI对面不会立即处理帧,但会等待一段时间进行下一次轮询.
较少的CPU使用率 - 仅在至少有一个数据包到来时才开始轮询.但即使没有收到框架,也不是徒劳无功,就好像是NAPI一样.
IRQ Coalesce之前NAPI有哪些优势?
linux performance network-programming interrupt linux-kernel
正如OpenCV 2.4.9.0中所知,这些特征检测器:SIFT, SURF, BRISK, FREAK, STAR, FAST, ORB.
所有这些都对CPU执行,但只FAST和ORBGPU上.http://docs.opencv.org/genindex.html
众所周知,有些是缩放/旋转不变的,但有些则不是:对于尺度不变特征提取,是否存在SURF和SIFT的快速替代方案?
这些是规模不变和旋转不变的:
但这些不是规模不变的,也不是旋转不变的:
是否有任何探测器在GPU上实现并且是缩放/旋转不变的?
或者将在GPU或OpenCL上的OpenCV 3.0中添加?
opencv feature-extraction computer-vision feature-detection orb
众所周知,nVidia DetectNet - 用于物体检测的CNN(卷积神经网络)基于Yolo/DenseBox的方法:https://devblogs.nvidia.com/parallelforall/deep-learning-object-detection-digits/
DetectNet是流行的GoogLeNet网络的扩展.扩展类似于Yolo和DenseBox 论文中采用的方法.
如图所示,DetectNet可以检测任何轮换的对象(汽车):https://devblogs.nvidia.com/parallelforall/detectnet-deep-neural-network-object-detection-digits/
现代CNN(卷积神经网络)作为DetectNet旋转不变吗?
我可以使用一个相同的物体旋转角度在数千个不同的图像上训练DetectNet,以检测任何旋转角度的物体吗?
那么旋转不变的是什么:Yolo,Yolo v2,基于DetectNet的DenseBox?
machine-learning computer-vision neural-network deep-learning conv-neural-network
c++ ×5
c++11 ×5
c ×2
c++14 ×2
c11 ×2
performance ×2
x86 ×2
assembly ×1
asynchronous ×1
boost ×1
boost-asio ×1
caching ×1
compile-time ×1
concurrency ×1
constexpr ×1
interrupt ×1
linux ×1
linux-kernel ×1
opencv ×1
optimization ×1
orb ×1
sse ×1