使用openmp并行化3个嵌套for循环的正确方法是什么?这样:
#pragma omp parallel for
for (i=0;i<SIZE;i++)
for(j=0;j<SIZE;j++)
for(k=0;k<SIZE;k++)
mresult[i][j]=mresult[i][j] + matrixa[i][k]*matrixb[k][j];
或者这样
#pragma omp parallel for
for (i=0;i<SIZE;i++)
#pragma omp parallel for
for(j=0;j
假设我有以下循环:
#pragma omp parallel for
for(int i=0;i<100;++i)
{
// some big code here
#pragma omp parallel for
for(int j=0;j<200;j++)
{
// some small code here
}
}
哪个循环是并行运行的?哪一个是最适合并行运行的?
这里的要点是:
1-如果i循环并行运行,因为那里有一些大代码,所以CPU缓存很有可能在循环的每次迭代中命中。
出于某些原因,我必须在嵌套循环中的每个for语句之间放置一些代码,如下所示:
for (int i = 0; i < n; ++i) {
//i have to put some code here
do something_1
for (int j = 0; j < n; ++j) {
//i have to put some code here
do something_2
for (int k = 0; k < n; ++k) {
do something_3
我有一段以下风格的代码:
for (set=0; set < n; set++) //For1
{
#pragma omp parallel for num_threads(x)
for (i=0; i < m; i++) //For2: this loop can be executed in parallel
{
commands...
}
for (j=0; j < m; j++) //For3: this loop depends on the output of the For2 and also should
我正在编写一个C++程序,对封闭的进行蛮力搜索.代码是。
我想使用OpenMP并行化这一点。我的问题是,这样做的方式,创造了足够的平行度。当前,我的代码的如下所示
#pragma omp parallel for reduction(+:count) if (depth==4)
for (size_t i=0;i<g.neighbours[last].size();i++){
auto n = g.neighbours[last][i];
// See if n can be used to extend or complete the tour
if (depth=
我正在用OpenMP写一个矩阵乘法的程序,为了方便缓存,它实现了乘法A x B(转置)行X行,而不是经典的A x B行x列,以提高缓存效率。这样做,我面对了一个有趣的事实,对我来说是不合逻辑的:如果在这段代码中并行化外部循环,程序会比将OpenMP指令放在最内部的循环中慢,在我的计算机中时间是10.9秒对8.1秒。
//A and B are double* allocated with malloc, Nu is the lenght of the matrixes
//which are square
//#pragma omp parallel for
for (i=0; i<
我有这样的代码,它使用循环平铺策略来转换矩阵。
void transposer(int n, int m, double *dst, const double *src) {
int blocksize;
for (int i = 0; i < n; i += blocksize) {
for (int j = 0; j < m; j += blocksize) {
// transpose the block beginning at [i,j]
for (int k = i; k < i + blocksiz
我开发了一个分布式内存MPI应用程序,它涉及网格的处理。现在我想用OpenMP应用共享内存技术(本质上是一个混合并行程序),看看它是否能变得更快,或者更高效。我很难使用OpenMP,特别是使用嵌套的for循环。我的应用程序包括每隔半秒钟将网格打印到屏幕上,但是当我用OpenMP并行它时,执行速度会慢10倍,或者根本不执行。控制台屏幕滞后并刷新自己的随机/意外数据。换句话说,这是完全错误的。看看下面的函数,它用于打印:
void display2dGrid(char** grid, int nrows, int ncolumns, int ngen)
{
//#pragma omp pa
我现在从OpenMP开始,需要在这个任务中使用OpenMP实现并行性:
for (i = 0; i < N; i++){
index += i*alpha + 4;
sum += array[index];
}
我打算使用约简操作符来得到和变量的正确值,但是为了做到这一点,我需要首先解决索引变量的依赖性。我怎么能这么做?
谢谢你的帮助!