我目前正在尝试提高我的代码的并行性能,但我对 OpenMP 仍然是新手。我必须迭代一个大容器,在每次迭代中从多个条目读取并将结果写入单个条目。下面是我正在尝试做的一个非常简单的代码示例。
data是一个指向数组的指针,其中存储了许多数据点。在并行区域之前,我创建了一个 Array newData,因此可以用作data只读和newData只写,之后我扔掉旧的data并用于newData进一步的计算。据我了解data,并且newData在线程之间共享,并且并行区域内声明的所有内容都是私有的。data多线程读取会导致性能问题吗?
我用于#critical为 的元素分配新值newData以避免竞争条件。这是必要的吗,因为我访问了每个元素newData一次,而从不通过多个线程访问?
我也不确定日程安排。我是否必须指定是否需要static时间表dynamic?nowait由于所有线程都是相互独立的,我可以使用吗?
array *newData = new array;
omp_set_num_threads (threads);
#pragma omp parallel
{
#pragma omp for
for (int i = 0; i < range; i++)
{
double middle = (*data)[i];
double previous = (*data)[i-1];
double next = (*data)[i+1];
double new_value = (previous + middle + …Run Code Online (Sandbox Code Playgroud)