允许常量字符串被调用函数的各种线程全局访问。
我有以下代码,该代码从字符列表(允许的字母)中选择一个随机字符,并将其附加以形成一个随机单词。我正在将其用于遗传算法,但是当我尝试对其进行并行化以使其更快时(作业分配),但最终却变慢了。在问了我的教授并解决了大多数问题之后,最后一个细节是我的字母不允许同时读取多个线程。
我尝试定义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秒。我检查了一下,这不是由于创建线程的时间所致。
应该通过使所有线程均可访问该字符串来解决此问题,但是我似乎无法编译并运行成功找到的任何解决方案。
答案 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:假设没有邪恶的const_cast
s
2:除非您将可变的全局变量放在同一缓存行上,否则这似乎不太可能。