在新标准 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。
有没有意义用限定符制作原子对象 - volatile?
使用:
volatile std::atomic<int> i(1);
Run Code Online (Sandbox Code Playgroud)
代替:
std::atomic<int> i(1);
Run Code Online (Sandbox Code Playgroud) 众所周知,在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)
我们知道: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) 在兼容x86的加速器MIC Intel Xeon Phi中是否有SIMD(SSE/AVX)指令?
当相机静止时,只需使用光流减去当前帧的前一帧即可轻松检测运动:
但是如何在我们自己运动的过程中检测到运动物体呢?当相机移动时,前一帧和当前帧之间的任何差异(减去)都会给我们带来背景的移动。
此外,前景(电线杆、树木)将比背景(天空)移动得更快。如果我们观察偏离运动平均值的所有事物,我们会发现这些杆子和树木,但它们实际上是静止的。
当我们的相机移动时,如何检测其他物体的运动?
例如,我们有1个CPU,8个核心.当通过Eth0-> TCP/IP-> App(不包括应用程序中的处理)时,可以使用多少个不同的最大CPU内核来处理一个IP数据包?
例如,它可能是3个CPU核心:
这对性能非常重要,因为核之间的每次数据传输都非常昂贵.
为什么我们不能同时实现的方法getAB() &&和getAB(),但可以实现其中任何一个?
码:
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)
码:
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)
码:
struct Beta { …Run Code Online (Sandbox Code Playgroud) 当我想通过设置 PAT(页面属性表 - PTE 中的 7 位)将内存区域标记为写入组合(禁用可缓存并使用 BIU)或不可缓存时,那么我必须使用什么,这两个函数之间有什么区别?
ioremap_[uc|wc][uc|wc] 访问类型来访问 PCI BAR:void __iomem *ioremap_wc(resource_size_t phys_addr, unsigned long size)set_memory_[uc|wc]设置 RAM 范围的访问类型:int set_memory_uc(unsigned long addr, int numpages)摘自: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) 什么是不同的功能:malloc()和kmalloc()?它们的区别仅在于:
malloc()可以在用户空间和内核空间被调用,它分配一个物理上分散的存储区域kmalloc()只能在内核空间中调用,并且它会分配物理上连续的内存块或者是其他东西?
kmalloc()在虚拟或物理寻址中使用指针有什么kmalloc()不同__ get_free_pages()?