我对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;
}
答案 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
是共享的。