定义由函数调用中的线程访问的全局const字符串变量

时间:2019-05-26 19:50:34

标签: c++ multithreading openmp

允许常量字符串被调用函数的各种线程全局访问。

我有以下代码,该代码从字符列表(允许的字母)中选择一个随机字符,并将其附加以形成一个随机单词。我正在将其用于遗传算法,但是当我尝试对其进行并行化以使其更快时(作业分配),但最终却变慢了。在问了我的教授并解决了大多数问题之后,最后一个细节是我的字母不允许同时读取多个线程。

我尝试定义GENES,然后使用#pragma omp threadprivate(GENES),这是我的教授说过的命令。

我尝试过

const string GENES = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPRSTUVWXYZ"
#pragma omp threadprivate(GENES)

编译后返回哪个。

error: ‘GENES’ declared ‘threadprivate’ after first use

我也尝试过

string GENES;
#pragma omp threadprivate(GENES)
GENES = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPRSTUVWXYZ;

返回:

error: ‘GENES’ declared ‘threadprivate’ after first use
#pragma omp threadprivate(GENES)
                             ^
error: ‘GENES’ does not name a type
GENES = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPRSTUVWXYZ 1234567890, .-;:_!\"#%&/()=?@${[]}";

最后,我尝试在线程中定义GENES并将其作为参数传递或将其硬编码到函数中。所有这些都会使程序变慢。

我希望程序运行得更快,但实际上运行起来会更慢,从添加线程后的0.5秒到1-3秒。我检查了一下,这不是由于创建线程的时间所致。

应该通过使所有线程均可访问该字符串来解决此问题,但是我似乎无法编译并运行成功找到的任何解决方案。

2 个答案:

答案 0 :(得分:1)

多亏了一位朋友,我终于使用以下代码使用#pragma omp threadprivate(GENES)进行了编译:

extern const string GENES;
#pragma omp threadprivate(GENES)
const string GENES = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPRSTUVWXYZ";

答案 1 :(得分:1)

  

我的字母不允许同时读取多个线程。

那是不正确的。

从具有多个线程的std::string读取完全可以!由于它是const,因此没有线程可以实际写入 1 。它既正确快速 2

通常在C ++中,const loosely implies thread-safe。保持GENES的共享状态,这很可能不是造成您的性能问题的原因。

如果您打算找出性能问题,建议您为平台使用了解线程/ OpenMP的适当性能分析工具。如果您想提出有关如何提高程序的并行性能的问题,请确保

  1. 包括一个minimal, reproducible example。这并不意味着包括您的整个程序。但是出现性能问题的最低版本。
  2. 分享您的特定测量结果和方法。
  3. 告诉我们如何编译程序以及在(CPU和内存)上运行程序的系统规格

1:假设没有邪恶的const_cast s

2:除非您将可变的全局变量放在同一缓存行上,否则这似乎不太可能。