gpt4 book ai didi

c++ - 在 OpenMP 中使用字符串类型进行缩减

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:15 25 4
gpt4 key购买 nike

我正在使用 OpenMP 像这样并行化一个 for 循环

std::stringType = "somevalue";
#pragma omp parallel for reduction(+ : stringType)
//a for loop here which every loop appends a string to stringType

我能想到的唯一方法是先以某种方式转换为 int 表示形式,然后在最后转换回来,但这有明显的开销。有没有更好的方法来执行这种操作方式?

最佳答案

如评论中所述,归约假设操作是结合可交换的。这些值可以按任何顺序计算,并通过任何类型的部分结果“累加”,最终结果将是相同的。

无法保证 OpenMP for 循环会将连续迭代分配给每个线程,除非循环计划明确要求这样做。也不能保证通过增加线程数来分配连续的 block (即线程 #0 可能会经历 1000-1999 次迭代,而线程 #1 会经历 0-999 次迭代)。如果您需要这种行为,那么您应该定义自己的时间表。

类似于:

int N=1000;
std::string globalString("initial value");

#pragma omp parallel shared(N,stringType)
{
std::string localString; //Empty string

// Set schedule
int iterTo, iterFrom;
iterFrom = omp_get_thread_num() * (N / omp_get_num_threads());
if (omp_get_num_threads() == omp_get_thread_num()+1)
iterTo = N;
else
iterTo = (1+omp_get_thread_num()) * (N / omp_get_num_threads());

// Loop - concatenate a number of neighboring values in the right order
// No #pragma omp for: each thread goes through the loop, but loop
// boundaries change according to the thread ID
for (int ii=iterTo; ii<iterTo ; ii++){
localString += get_some_string(ii);
}

// Dirty trick to concatenate strings from all threads in the good order
for (int ii=0;ii<omp_get_num_threads();ii++){
#pragma omp barrier
if (ii==omp_get_thread_num())
globalString += localString;
}

}

更好的方法是拥有一个共享的 std::string 数组,每个线程使用一个作为本地累加器。最后,单个线程可以运行串联部分(并避免肮脏的技巧及其所有开销很大的 barrier 调用)。

关于c++ - 在 OpenMP 中使用字符串类型进行缩减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53806113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com