循环和指针的OpenMP
OpenMP for loop and pointer
我对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
是共享的。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- OpenMP阵列性能较差
- OpenMP和智能指针
- OpenMP中的本地指针
- 在使用指向方法的指针进行调用时使用OpenMP
- 在与 OpenMP 并行的嵌套 for 循环中写入共享数组(通过指针)如何产生错误的结果
- 传递"shared"指针的 OpenMP 任务
- 我怎么能用这个OpenMP关键部分来避免这个原始指针呢
- 在c++中使用openmp更新2d指针
- 循环和指针的OpenMP