循环和指针的OpenMP

OpenMP for loop and pointer

本文关键字:OpenMP 指针 循环      更新时间:2023-10-16

我对openmp没有太多经验。

通过使用for循环指针而不是索引,是否可以使以下代码更快?

有没有办法让下面的代码更快?

该代码将数组与常数相乘。

谢谢。

代码:

#include <iostream>
#include <stdlib.h>
#include <stdint.h>
#include <vector>
using namespace std;
int main(void){
    size_t dim0, dim1;
    dim0 = 100;
    dim1 = 200;
    std::vector<float> vec;
    vec.resize(dim0*dim1);
    float scalar = 0.9;
    size_t size_sq = dim0*dim1;
    #pragma omp parallel
    {       
        #pragma omp for
        for(size_t i = 0; i < size_sq; ++i){
            vec[i] *= scalar;
        }   
    }   
}

串行指针循环

float* ptr_start = vec.data();
float* ptr_end   = ptr_start + dim0*dim1;
float* ptr_now;
for(ptr_now = ptr_start; ptr_now != ptr_end; ++ptr_now){
    *(ptr_now) *= scalar;
}

串行指针循环应该类似

size_t size_sq = vec.size();
float * ptr = vec.data();
#pragma omp parallel
{       
    #pragma omp for
    for(size_t i = 0; i < size_sq; i++){
        ptr[i] *= scalar;
    }   
} 

ptr对于所有线程都是相同的,所以没有问题。

作为一种解释,数据共享属性子句(维基百科):

共享:平行区域内的数据是共享的,这意味着所有线程同时可见和可访问。默认情况下,所有工作共享区域中的变量是共享的,循环除外迭代计数器。

private:并行区域内的数据对每个线程都是私有的,这意味着每个线程都将有一个本地副本,并将其用作临时变量。私有变量未初始化值不保持在平行区域之外使用。通过默认情况下,OpenMP循环构造中的循环迭代计数器为私有的

在这种情况下,i是私有的,ptr是共享的。