Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用多线程(例如openmp)处理缓存数据结构 我使用OpenMP来并行化我们的C++库。在这里,我们有很多地方可以通过将结果存储在变量中(即缓存结果以供重用)来避免重新计算某些内容。但是,该行为在类的方法中对用户隐藏。例如,在第一次使用方法时,缓存将被填充。所有后续使用将仅从缓存中读取_C++_Multithreading_Caching_Openmp - Fatal编程技术网

如何使用多线程(例如openmp)处理缓存数据结构 我使用OpenMP来并行化我们的C++库。在这里,我们有很多地方可以通过将结果存储在变量中(即缓存结果以供重用)来避免重新计算某些内容。但是,该行为在类的方法中对用户隐藏。例如,在第一次使用方法时,缓存将被填充。所有后续使用将仅从缓存中读取

如何使用多线程(例如openmp)处理缓存数据结构 我使用OpenMP来并行化我们的C++库。在这里,我们有很多地方可以通过将结果存储在变量中(即缓存结果以供重用)来避免重新计算某些内容。但是,该行为在类的方法中对用户隐藏。例如,在第一次使用方法时,缓存将被填充。所有后续使用将仅从缓存中读取,c++,multithreading,caching,openmp,C++,Multithreading,Caching,Openmp,我现在的问题是,在多线程程序中,多个线程可以同时调用这样一个方法,从而在创建/访问缓存时产生争用条件。我现在通过把缓存放在一个关键的部分来解决这个问题,但是这当然会减慢速度 示例类可能如下所示 class A { public: A() : initialized(false) {} int get(int a) { #pragma omp critical(CACHING) if (!initialized) initia

我现在的问题是,在多线程程序中,多个线程可以同时调用这样一个方法,从而在创建/访问缓存时产生争用条件。我现在通过把缓存放在一个关键的部分来解决这个问题,但是这当然会减慢速度

示例类可能如下所示

class A {
public:
   A() : initialized(false)
     {}
   int get(int a)
      { 
#pragma omp critical(CACHING)
        if (!initialized)
          initialize_cache();
        return cache[a];
      }
private:
   bool initialized;
   void initialize_cache()
     {
       // do some heavy stuff
       initialized=true;
     }
   int *cache;
};
如果关键部分在initialize_cache()函数中会更好,因为它只会在缓存尚未初始化时锁定所有线程(即仅一次),但这似乎很危险,因为多个线程可能会同时尝试初始化缓存

有什么改进的建议吗?理想情况下,该解决方案将与较旧的OpenMP版本兼容(甚至是Visual Studio的v2…)


PS:以前可能会问这个问题,但是搜索openmp和缓存会在处理器缓存上抛出很多东西,这不是我想知道的…

高效的单例是您的最佳选择。 请检查这里

而且

下面是我在上面展示的视频的完整代码片段:

class Foo {
public:
    static Foo* Instance();
private:
    Foo() {init();}
    void init() { cout << "init done." << endl;} // your init cache function.
    static atomic<Foo*> pinstance;
    static mutex m_;
};

atomic<Foo*> Foo::pinstance { nullptr };
std::mutex Foo::m_;

Foo* Foo::Instance() {
  if(pinstance == nullptr) {
    lock_guard<mutex> lock(m_);
    if(pinstance == nullptr) {
        pinstance = new Foo();
    }
  }
  return pinstance;
}
class-Foo{
公众:
静态Foo*实例();
私人:
Foo(){init();}
void init()

…但我推荐以下选项之一,而不是DCL模式:

  • (POSIX线程库)
  • (C++11标准库)
  • 线程安全
    静态
    变量(C++11核心语言功能)

你能创建一个新类和该类的全局变量,并让新的ctor进行初始化吗?在现实生活中,我的对象在运行时使用不同的参数进行设置。设置后,缓存将被清除,因为它不再合适。因此,不,我不能有全局变量。另外,由于缓存内容的计算时间非常高gh,而且并非在所有使用情况下都需要它,我们目前避免初始化缓存,除非我们真的需要它。(从问题中你无法知道这一点。我猜这是在尝试制作一个简单的示例时发生的)。是否有可能在早期版本的openmp中实现这一点?我需要尽可能实现跨平台兼容。此解决方案是否克服了DCL模式的问题(参见示例)顺便说一句,在OpenMP v3.0之前,除了直接使用
omp critical
构造外,没有任何可移植的方法。我认为这段代码在OpenMP内存模型下运行良好,因为
初始化的
的访问被指定为原子访问,并且无论如何受到critical section的保护。谢谢。我的缓存需要是特定于对象的,即不是单一的但我得承认,从我的问题来看,可能的问题并不清楚。
class A {
public:
   A() : initialized(false)
     {}
   int get(int a)
      {
        bool b;
#pragma omp atomic read
        b = initialized;
        if (!b) {
#pragma omp critical(CACHING)
          // you must recheck in critical section
          if (!initialized)
            initialize_cache();
        }
        return cache[a];
      }
private:
   bool initialized;
   void initialize_cache()
     {
       // do some heavy stuff
#pragma omp atomic write
       initialized = true;
     }
   int *cache;
};