OpenMP for循环和指针

时间:2016-07-29 17:42:06

标签: c++ parallel-processing openmp

我对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;
}

1 个答案:

答案 0 :(得分:1)

串行指针循环应该像

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都是一样的,所以没问题。

作为解释,Data sharing attribute clauses (wikipedia)

  

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

     

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

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