小编Ale*_*lex的帖子

检查前提条件是否存在原子增量,即原子值小于指定值?

在新标准 C++ 原子递增操作中,在递增值之前检查先决条件是否表明原子值小于指定值?

我可以比下面的代码更容易、更快吗?

int atomic_inc(std::atomic_int& val, int less_than) {
 int new_val;
 int old_val = val.load();
 do
 {
   if (old_val > less_than) return old_val;
   new_val = old_val + 1;
 } while (!val.compare_exchange_weak(old_val, new_val));

 return new_val;
}
Run Code Online (Sandbox Code Playgroud)

如果有人不知道compare_exchange_weak是如何工作的:compare_exchange_weak读取val,与old_val进行比较,如果不相等则将val保存到old_val。如果相等则将new_val保存到val。

c++ atomic atomic-swap c++11 stdatomic

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

是否有任何意义使用限定符 - volatile生成std :: atomic <>对象?

有没有意义用限定符制作原子对象 - volatile?

使用:

volatile std::atomic<int> i(1);
Run Code Online (Sandbox Code Playgroud)

代替:

std::atomic<int> i(1);
Run Code Online (Sandbox Code Playgroud)

c++ atomic c++11

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

`std :: memory_order_acquire`的语义是否需要x86/x86_64上的处理器指令?

众所周知,在x86上,操作load()store()内存屏障memory_order_consume, memory_order_acquire, memory_order_release, memory_order_acq_rel不需要处理器指令用于缓存和管道,并且汇编程序的代码总是对应std::memory_order_relaxed,并且这些限制仅对编译器的优化是必需的:http:// www. stdthread.co.uk/forum/index.php?topic=72.0

此代码反汇编代码确认store()(MSVS2012 x86_64):

std::atomic<int> a;
    a.store(0, std::memory_order_relaxed);
000000013F931A0D  mov         dword ptr [a],0  
    a.store(1, std::memory_order_release);
000000013F931A15  mov         dword ptr [a],1  
Run Code Online (Sandbox Code Playgroud)

但是这段代码并没有为load()(MSVS2012 x86_64)确认这一点,使用lock cmpxchg:

    int val = a.load(std::memory_order_acquire);
000000013F931A1D  prefetchw   [a]  
000000013F931A22  mov         eax,dword ptr [a]  
000000013F931A26  mov         edx,eax  
000000013F931A28  lock cmpxchg dword ptr [a],edx  
000000013F931A2E  jne         main+36h (013F931A26h)  

    std::cout << val << "\n";
Run Code Online (Sandbox Code Playgroud)

安东尼威廉姆斯说 …

c++ concurrency x86 memory-barriers c++11

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

nVidia RDMA GPUDirect是否始终仅运行物理地址(在CPU的物理地址空间中)?

我们知道:http://en.wikipedia.org/wiki/IOMMU#Advantages

IOMMU可以支持外围存储器分页.使用PCI-SIG PCIe地址转换服务(ATS)页面请求接口(PRI)扩展的外设可以检测并发出对内存管理器服务的需求.

在此输入图像描述

但是当我们使用CUDA> = 5.0的nVidia GPU时,我们可以使用RDMA GPUDirect,并且知道:

http://docs.nvidia.com/cuda/gpudirect-rdma/index.html#how-gpudirect-rdma-works

传统上,使用CPU的MMU作为内存映射I/O(MMIO)地址,将BAR窗口等资源映射到用户或内核地址空间.但是,由于当前的操作系统没有足够的机制来在驱动程序之间交换MMIO区域,因此NVIDIA内核驱动程序会导出函数以执行必要的地址转换和映射.

http://docs.nvidia.com/cuda/gpudirect-rdma/index.html#supported-systems

从PCI设备的角度来看,GPUDirect的RDMA当前依赖于所有物理地址是相同的.这使它与IOMMU不兼容,因此必须禁用它们才能使RDUD for GPUDirect正常工作.

如果我们将CPU-RAM分配并映射到UVA,如下所示:

#include <iostream>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"

int main() {
    // Can Host map memory
    cudaSetDeviceFlags(cudaDeviceMapHost);  

    // Allocate memory
    unsigned char *host_src_ptr = NULL;
    cudaHostAlloc(&host_src_ptr, 1024*1024, cudaHostAllocMapped);
    std::cout << "host_src_ptr = " << (size_t)host_src_ptr << std::endl;

    // Get UVA-pointer
    unsigned int *uva_src_ptr = NULL;
    cudaHostGetDevicePointer(&uva_src_ptr, host_src_ptr, 0);
    std::cout << "uva_src_ptr  = " << (size_t)uva_src_ptr << std::endl;

    int b; …
Run Code Online (Sandbox Code Playgroud)

cuda gpgpu memory-mapping pci-e gpudirect

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

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

OpenCV 上移动摄像机的运动检测器

当相机静止时,只需使用光流减去当前帧的前一帧即可轻松检测运动:

但是如何在我们自己运动的过程中检测到运动物体呢?当相机移动时,前一帧和当前帧之间的任何差异(减去)都会给我们带来背景的移动。

此外,前景(电线杆、树木)将比背景(天空)移动得更快。如果我们观察偏离运动平均值的所有事物,我们会发现这些杆子和树木,但它们实际上是静止的。

当我们的相机移动时,如何检测其他物体的运动?

camera opencv motion-detection motion opencv3.0

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

可以使用多少个不同的最大CPU内核来处理一个IP数据包?

例如,我们有1个CPU,8个核心.当通过Eth0-> TCP/IP-> App(不包括应用程序中的处理)时,可以使用多少个不同的最大CPU内核来处理一个IP数据包?

例如,它可能是3个CPU核心:

  1. 处理硬件中断
  2. 进程校验和计算
  3. 进程复制内核空间 - >用户空间(其指针已发送到套接字)

这对性能非常重要,因为核之间的每次数据传输都非常昂贵.

c sockets tcp linux-device-driver linux-kernel

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

为什么我们不能实现两个方法`getAB()&&`和`getAB()`?

为什么我们不能同时实现的方法getAB() &&getAB(),但可以实现其中任何一个?

  1. 作品:http://ideone.com/4EgObJ

码:

struct Beta {
  Beta_ab ab;
  Beta_ab && getAB() && { cout << "1"; return move(ab); }
};

int main() {    
    Beta_ab ab = Beta().getAB();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. 作品:http://ideone.com/m9d0Tz

码:

struct Beta {
  Beta_ab ab;
  Beta_ab && getAB() { cout << "2"; return move(ab); }
};

int main() {
    Beta b;
    Beta_ab ab = b.getAB();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. 不起作用:http://ideone.com/QIQtZ5

码:

struct Beta { …
Run Code Online (Sandbox Code Playgroud)

c++ rvalue-reference move-semantics c++11 c++14

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

这两个函数有什么区别:`ioremap_uc()` 和 `set_memory_uc`?

当我想通过设置 PAT(页面属性表 - PTE 中的 7 位)将内存区域标记为写入组合(禁用可缓存并使用 BIU)或不可缓存时,那么我必须使用什么,这两个函数之间有什么区别?

摘自:http : //lwn.net/Articles/278994/

为什么我不能对 PCI BAR 和 RAM 范围使用相同的单一功能?

澄清:ioremap_uc()获取物理地址并返回虚拟地址 是否设置为 Uncacheable,而set_memory_uc()哪个获取虚拟地址并为这些页面设置 Uncacheable?

这些代码相等吗?

void* virt_ptr = ioremap_uc(phys_ptr, size);
Run Code Online (Sandbox Code Playgroud)

void* virt_ptr = ioremap(phys_ptr, size);
const int page_size = 4096;
set_memory_uc(virt_ptr, size/page_size);
Run Code Online (Sandbox Code Playgroud)

c linux caching posix virtual-address-space

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

什么是不同的函数:`malloc()`和`kmalloc()`?

什么是不同的功能:malloc()kmalloc()?它们的区别仅在于:

  • malloc()可以在用户空间和内核空间被调用,它分配一个物理上分散的存储区域
  • kmalloc()只能在内核空间中调用,并且它会分配物理上连续的内存块

或者是其他东西?

kmalloc()在虚拟或物理寻址中使用指针有什么kmalloc()不同__ get_free_pages()

c memory posix memory-management

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