【发布时间】:2021-08-13 01:40:27
【问题描述】:
我在多个线程上执行了一个循环。每个循环都会将一个值存储到一个全局向量中。所有线程都使用向量索引变量,每个线程在向量更新后递增索引。 必须保护对索引的访问。 OpenMP 中是如何进行保护的?
1/ 如果我指定#pragma omp parallel shared(k) 这会保护(同步访问)跨线程的 k-index 访问吗?
int k = 0;
#pragma omp parallel shared(k)
for (int i = 1; i < d; ++i)
{
for (int j = 0; j < i; ++j)
{
my_vec[k++] = some_value; //no need to protect my_vector, if k is unique across trheads
}
}
2/ 我需要使用临界区吗
int k = 0;
#pragma omp parallel
for (int i = 1; i < d; ++i)
{
for (int j = 0; j < i; ++j)
{
#pragma omp critical (section_name)
{
my_vec[k++] = some_value;
}
}
}
3/我需要同时使用共享子句和临界区块吗?
【问题讨论】:
标签: c++ multithreading performance parallel-processing openmp