memory-barriers

    0热度

    1回答

    我有一个使用6 GL计算着色器序列的Marching Cubes的GPU实现,每个读取缓冲区之前写入的缓冲区都有相应的内存屏障。早期阶段中使用的缓冲区保存临时标记变量,并且在不再需要时将其大小调整为0,但不会删除,因为我将在稍后的运行中再次使用它们。 在某些阶段,我需要从着色器中的缓冲区中读取数据,然后在着色器完成之后立即释放它,然后为下一个着色器阶段分配缓冲区。我的问题是如何安全地做到这一点。内

    1热度

    1回答

    何时可以通过使用内存障碍来避免锁?就像在这种情况下一样:Consumer-Producer-Wiki(最后一种实现是使用内存屏障,并且所有休息都使用锁或信号量。) 在锁之类的情况下使用内存屏障是否更好?如果是,为什么? 使用内存障碍可以避免锁的最常见情况是什么?

    6热度

    1回答

    试图用我的想法去上同时使用软件和硬件的记忆障碍,我可以禁用外,为了优化为与编译器的优化编译代码内部的特定功能的,因此我也使用像Peterson或Deker算法需要外的顺序没有执行实现软件旗语,我已经测试了以下代码包含两个SW屏障asm volatile("": : :"memory")和gcc内建HW屏障__sync_synchronize: #include <stdio.h> int mai

    0热度

    1回答

    AtomicPointer在性LevelDB实现如下: class AtomicPointer { private: void* rep_; public: AtomicPointer() { } explicit AtomicPointer(void* p) : rep_(p) {} inline void* NoBarrier_Load() cons

    2热度

    1回答

    考虑这个代码(由Simple-Web-Server提取,但图书馆的知识不应该是必要回答这个问题): HttpServer server; thread server_thread; server.config.port = 8080; server.default_resource["GET"] = [](shared_ptr<HttpServer::Response> response,

    1热度

    2回答

    对不起,如果这是非常基本的。这是我正在做的简化版本。我正在编写一个内核模块。当它运行时,会有两个线程,一个两个不同的物理CPU。我正在使用全局变量在这些线程之间进行某些通信。奇怪的是,有时一个线程的写入不会被另一个线程看到。可能是什么原因? 我怀疑它有记忆障碍,也许缓存同步做的,所以我一直在使用smp_wmb()写操作后尝试过,但似乎并没有帮助。据我所知,我不能明确地控制缓存同步。所以我有点卡住了

    5热度

    1回答

    我有一个RingBuffer哪些服务一个消费者和一个生产者和使用两个整数检测新的数据: _lastReadIndex _lastWrittenIndex 所以在ringbuffer未读数据时,这两个值不相等。 生产者增量(并且模缓冲缓冲区大小以环绕)_lastWrittenIndex当项目被添加到环缓冲区时。 消费者旋转时,阅读两个值,检查新数据,并在那里,它会增量(和模量)_lastRea

    1热度

    1回答

    我想了解如何在C++中工作内存障碍。 例如,我使用的std ::原子在这种情况下: #include <iostream> #include <atomic> int main() { std::atomic<int> a; int n = load();//returns 1 or other value written by other thread a.

    3热度

    2回答

    我知道,一个存储器屏障防止前指令的重新排序后和从后到存储器屏障之前,例如,如果我有以下操作的指令: instruction 1 instruction 2 instruction 3 memory barrier instruction 4 instruction 5 instruction 6 ,这些指令可以被执行下面的命令: instruction 3 instruction

    2热度

    1回答

    我有关于内存映射io的问题。 假设有一个内存映射的IO外设,其值正在被CPU读取。一旦读取,该值就存储在缓存中。但内存中的值已由外部IO外设更新。 在这种情况下,CPU如何确定缓存已失效,以及对于这种情况可能是什么解决方法?