请帮助我使用openmp使这个代码并行这个代码是在按钮点击运行,文本框是128
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace IMG
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string path = "";
public void openimage()
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
path = openFileDialog1.FileName;
Graphics g = this.CreateGraphics();
g.Clear(this.BackColor);
Bitmap curBitmap = new Bitmap(path);
g.DrawImage(curBitmap, 200, 220, 200, 200);
}
}
Bitmap bm;
Bitmap gs;
private void button1_Click(object sender, EventArgs e)
{
if (path == "") …Run Code Online (Sandbox Code Playgroud) 我有一个以下并行片段:
#include <omp.h>
#include "stdio.h"
int main()
{
omp_set_num_threads(4);
int i;
#pragma omp parallel private(i)
{
#pragma omp for
for(i = 0;i < 10; i++) {
printf("A %d: %d\n", omp_get_thread_num(),i);
}
#pragma omp critical
printf("i %d: %d\n", omp_get_thread_num(), i );
}
}
Run Code Online (Sandbox Code Playgroud)
我认为在循环之后,每个线程将i等于i线程循环中的最后一个值.我想要的输出是:
A 0: 0
A 0: 1
A 0: 2
A 3: 9
A 2: 6
A 2: 7
A 2: 8
A 1: 3
A 1: 4
A 1: 5
i …Run Code Online (Sandbox Code Playgroud) 我有一个C parallel for循环,包括一行
b[i] = b[0];
Run Code Online (Sandbox Code Playgroud)
所以我需要在开始任何其他迭代之前完成第一次迭代.是否有强制执行此类行为的条款?
我发现openmp不支持while循环(或者至少不太喜欢它们).而且也不喜欢'!='运算符.
我有这段代码.
int count = 1;
#pragma omp parallel for
while ( fgets(buff, BUFF_SIZE, f) != NULL )
{
len = strlen(buff);
int sequence_counter = segment_read(buff,len,count);
if (sequence_counter == 1)
{
count_of_reads++;
printf("\n Total No. of reads: %d \n",count_of_reads);
}
count++;
}
Run Code Online (Sandbox Code Playgroud)
关于如何管理这个的任何线索?我在某处读到(包括stackoverflow的另一篇文章)我可以使用管道.那是什么 ?以及如何实施它?
我想用LSF提交一份工作:
在没有LSF的情况下,我只需在4个节点上启动mpi,例如:
mpirun -hosts host1,host2,host3,host4 -np 4 ./myprocess --numthreads = 12
但是,在LSF存在的情况下,我看不出怎么做?我确信这可能是一种非常标准的方法,但我对LSF来说还是个新手.我用Google搜索,但答案对我来说并不是很明显.我在LSF中发现了混合MPI/OpenMP,但它似乎并不完全相同,似乎一次只需要一台主机.
对于我的一些家庭作业,我需要通过向量实现矩阵的乘法,按行和列并行化.我确实理解行版本,但我在列版本中有点困惑.
假设我们有以下数据:

行版本的代码:
#pragma omp parallel default(none) shared(i,v2,v1,matrix,tam) private(j)
{
#pragma omp for
for (i = 0; i < tam; i++)
for (j = 0; j < tam; j++){
// printf("Hebra %d hizo %d,%d\n", omp_get_thread_num(), i, j);
v2[i] += matrix[i][j] * v1[j];
}
}
Run Code Online (Sandbox Code Playgroud)
这里的计算是正确的,结果是正确的.
列版本:
#pragma omp parallel default(none) shared(j,v2,v1,matrix,tam) private(i)
{
for (i = 0; i < tam; i++)
#pragma omp for
for (j = 0; j < tam; j++) {
// printf("Hebra %d hizo %d,%d\n", omp_get_thread_num(), i, …Run Code Online (Sandbox Code Playgroud) 使用LLVM clang ++ 4.9.2使用OMP指令编译cpp程序时,我看到了隐藏函数@ .omp_outlined。是在位码中生成的。我想知道这个隐藏函数是什么,是否有可能避免生成它。
我有简单的程序:
int index;
unsigned int count = 0;
#pragma omp parallel for
for (index = 0; index < 10000; index++)
{
count++;
}
Run Code Online (Sandbox Code Playgroud)
问题是我认为count应该等于10000.但是它通常在5000左右.大约10%它等于10000.
这里发生了什么?
我有一个可以解决数独难题的程序,并且可以按顺序工作,但是现在我正在尝试使用openMP对其进行并行化。该函数solvePuzzle()包括算法,我想在其中并行化for循环,但是当我#pragma omp parallel for在for循环之前添加语句时,出现此错误: fatal error C1001: An internal error has occurred in the compiler.
该函数的代码是solvePuzzle():
bool sudoku::solvePuzzle(int grid[CELL][CELL]) {
int row, col;
if (!findEmptyCell(grid, row, col))
return true;
#pragma omp parallel for
for (int num = 1; num <= 9; num++) {
if (checkAccuracy(grid, row, col, num)) {
grid[row][col] = num;
if (solvePuzzle(grid))
return true;
grid[row][col] = EMPTY_CELL;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
这是主要驱动程序,如果有帮助的话:
#include "SudokuGrid.h"
using namespace std;
int main() {
sudoku …Run Code Online (Sandbox Code Playgroud) 我在C++中使用多线程函数.使用n多线程,我有n随机输出.我需要计算代码中多线程输出的平均值.让我们假设n=4线程,代码是
#include <omp.h>
#include <unistd.h>
#include <stdio.h>
#include <random>
#include <iostream>
#include <cmath>
#include <iomanip>
#include <array>
#include <eigen3/Eigen/Dense>
#define W 1.0
#define avg_disorder 10
#define numThd 4
int main()
{
#pragma omp parallel num_threads(numThd)
{
// define random numbers
std::mt19937 rng;
std::uniform_real_distribution <> dist;
std::random_device r;
std::array<int,624> seed_data;
std::generate(seed_data.begin(), seed_data.end(), std::ref(r));
std::seed_seq seq(std::begin(seed_data), std::end(seed_data));
rng.seed(seq);
Eigen::Array<double, -1, 1> rp; // rp= random potential
rp = Eigen::Array<double, -1, 1>::Zero(avg_disorder, 1);
//List of 10 random …Run Code Online (Sandbox Code Playgroud)