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

defining global const string variable to be accessed by threads in function calls

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

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

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

我试过了

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

编译时returns这个

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

我也试过了

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

哪个returns:

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 秒。我检查了一下,这不是因为创建线程的时间。

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

所以我终于用 #pragma omp threadprivate(GENES) 编译了它,感谢一位朋友使用以下代码:

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

my alphabet doesn't allow multiple threads to read at the same time.

这不是真的。

从具有多个线程的 std::string 读取 完全没问题!因为这是 const,没有线程可以实际写入它 1正确快速2.

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

如果您的目标是找出您的性能问题,我建议为您的平台使用适当的性能分析工具,这些工具可以识别线程/OpenMP。如果您想询问有关如何提高程序并行性能的问题,请确保

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

1:假设没有邪恶const_casts

2:除非你把一个可变的全局变量放在同一个 cache-line 上,这似乎不太可能。