定义函数调用中线程访问的全局常量字符串变量
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。如果您想询问有关如何提高程序并行性能的问题,请确保
- 包括一个 minimal, reproducible example。这并不意味着包括您的 整个程序 。但是出现性能问题的最小版本。
- 分享您的具体测量结果和方法。
- 告诉我们你是如何编译程序的,以及你运行它在(CPU & 内存)
上的系统规格
1:假设没有邪恶const_cast
s
2:除非你把一个可变的全局变量放在同一个 cache-line 上,这似乎不太可能。
允许调用函数的各种线程全局访问常量字符串。
我有以下代码,它从字符列表(允许的字母表)中选择一个随机字符并将其附加以形成一个随机单词。我将其用于遗传算法,但是当我尝试将其并行化以使其更快(作业分配)时,但最终速度变慢了。在问了我的教授并解决了大部分问题之后,最后一个细节是我的字母表不允许同时读取多个线程。
我已经尝试定义 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。如果您想询问有关如何提高程序并行性能的问题,请确保
- 包括一个 minimal, reproducible example。这并不意味着包括您的 整个程序 。但是出现性能问题的最小版本。
- 分享您的具体测量结果和方法。
- 告诉我们你是如何编译程序的,以及你运行它在(CPU & 内存) 上的系统规格
1:假设没有邪恶const_cast
s
2:除非你把一个可变的全局变量放在同一个 cache-line 上,这似乎不太可能。