允许调用函数的各种线程全局访问常量字符串。
我有以下代码,它从字符列表(允许的字母表)中选择一个随机字符并将其附加以形成一个随机单词。我将此用于遗传算法,但是当我尝试对其进行并行化以使其更快(家庭作业分配)时,它最终会变慢。在询问了我的教授并解决了大部分问题之后,最后一个细节是我的字母表不允许多个线程同时阅读。
我曾尝试定义 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 秒。我查了一下,这不是由于创建线程的时间。
这应该通过使所有线程都可以访问字符串来解决,但我似乎无法编译和运行我成功找到的任何解决方案。
我的字母表不允许多个线程同时阅读。
这不是真的。
从多线程读取是完全没问题的std::string
!既然如此,则const
没有线程可以实际写入它1。它既正确又快速2。
通常在 C++ 中,const
松散地暗示线程安全。保持GENES
共享,这很可能不是您性能问题的原因。
如果您的目标是找出性能问题,我建议为您的平台使用适当的性能分析工具,这些工具可以识别线程/OpenMP。如果您想询问有关如何提高程序并行性能的问题,请确保
1:假设没有恶const_cast
小号
2:除非您将可变全局变量放在同一缓存行上,这似乎不太可能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句