openmp 互斥锁 mysql_并发读写OpenMp中的共享变量

news/2024/8/26 20:22:47

我基本上有三个关于OpenMp的问题。并发读写OpenMp中的共享变量

Q1。 OpenMp是否提供互斥共享变量?考虑下面的三个嵌套循环的简单矩阵乘法代码,使用C++中的OpenMp并行化。这里A,B和C是动态空间分配双**类型的变量。线程数被适当分配一个值。

#pragma omp parallel

{

int tid = omp_get_thread_num();

int fraction = (n/threadCount);

int start = tid * fraction;

int end = (tid+1) * fraction;

for (int start = 0; i < end; i++)

{

for (int j = 0; j < N; j++)

{

C[i][j] = 0;

for (int k = 0; k < N; k++)

C[i][j] += A[i][k] * B[k][j];

}

}

}

这里的事情是,从A和B读取并写入C的互斥是不必要的。但如果由于A,B和C上的互斥造成额外的开销,则有利于减轻互斥量的A,B和C.如何实现?

Q2。 考虑在上面的代码中引入两个私有变量tempA和tempB,如下所示。

double **tempA, **tempB;

#pragma omp parallel private(tempA, tempB)

{

int tid = omp_get_thread_num();

int fraction = (n/threadCount);

int start = tid * fraction;

int end = (tid+1) * fraction;

tempA = A;

tempB = B;

for (int start = 0; i < end; i++)

{

for (int j = 0; j < N; j++)

{

C[i][j] = 0;

for (int k = 0; k < N; k++)

C[i][j] += tempA[i][k] * tempB[k][j];

}

}

}

该策略是否可以在计算过程中减少A和B的互斥量?我的意思是,虽然所有线程都访问相同的位置(由A和tempA,B和tempB引用),但它们通过不同的局部变量引用它们。

Q3。 另外,我想知道在并行代码段中声明变量tempA和tempB的区别,而不是在外部声明它们。当然,那么我们将不需要该指令中的私人条款。有没有其他的显着差异。

2017-06-22

Melanka

+0

(1)你为什么要用手工作而不是使用'#pragma omp for'? (2)为了同步对共享变量的读写,有['#pragma omp atomic'](https://www.google.com/search?q=pragma+omp+atomic)。 (3)不要重新发明轮子,使用[Blaze](https://bitbucket.org/blaze-lib/blaze)。该线性代数库实现了OpenMP并行化和SIMD向量化矩阵操作。它不能比这更快。 –


http://www.niftyadmin.cn/n/2422839.html

相关文章

java idgenerator_Java IdGenerator.newId方法代码示例

import com.hazelcast.core.IdGenerator; //导入方法依赖的package包/类/*** {inheritDoc}*/Overridepublic void start(ClusterManager manager) throws AndesException{this.manager manager;/*** register topic listeners for cluster events. This has to be done* after…

Gartner:2016年十大信息安全技术(含解读)

在刚刚结束的2016年Gartner安全与风险管理峰会上&#xff0c;发布了2016年十大信息安全技术&#xff08;http://www.gartner.com/newsroom/id/3347717&#xff09;。这里提及的10大技术基本上都在以往的报告中详细阐述过。这10大技术分别是&#xff1a;1&#xff09;云访问安全…

English - every和each的用法和区别

两者都有“每个”的意思,但用法不同&#xff1a; &#xff08;1&#xff09;each具有名词和形容词的功能,every只有形容词的功能. &#xff08;2&#xff09;each指两个或两个以上的人或事物中的“每个”&#xff1b;every是指三个以上的人或事物的“全体”,和all的意思相近.如…

Codeforces Round #358 (Div. 2) E. Alyona and Triangles 随机化

E. Alyona and Triangles题目连接&#xff1a; http://codeforces.com/contest/682/problem/E Description You are given n points with integer coordinates on the plane. Points are given in a way such that there is no triangle, formed by any three of these n point…

Python文件处理之文件写入方式与写缓存(三)

Python的open的写入方式有&#xff1a; write(str):将str写入文件 writelines(sequence of strings):写多行到文件&#xff0c;参数为可迭代对象 首先来看下writelines()这个方法&#xff1a; 1 f open(blogCblog.txt, w) #首先先创建一个文件对象&#xff0c;打开方式为w 2 …

python旋转背景图_在python中旋转图像并移除背景

使用cv2.boundingRect将提供适合轮廓的最小非旋转矩形。cv2.boundingRect结果&#xff1a;您将需要使用cv2.boundingRect&#xff0c;而不是使用cv2.minareRect来获得一个适合轮廓的矩形。cv2.minarerect结果&#xff1a;在获得旋转矩形信息后&#xff0c;需要找到模型点与当前…

java 垃圾回收_java 垃圾回收总结(1)

以前看过很多次关于垃圾回收相关的文章&#xff0c;都只是看过就忘记了&#xff0c;没有好好的整理一下&#xff0c;发现写文章可以强化自己的记忆。java与C,c有很大的不同就是java语言开发者不需要关注内存信息&#xff0c;不会显式的直接操作内存&#xff0c;而是通过jvm虚拟…

软件设计与分析方法

分析和设计方法 写软件就是要解决用户的需求&#xff0c;我们需要表达和传递下面这些信息&#xff1a; 在“需求分析”阶段&#xff0c;我们要搞清楚 在问题领域中的现实世界里&#xff0c;都有哪些实体&#xff0c;如何抽象出我们真正关心的属性&#xff0c;实体之间的关系是什…