Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在Visual Studio 2010(OpenMP)中并行化for循环_C_Multithreading_Visual Studio 2010_For Loop_Openmp - Fatal编程技术网

C 在Visual Studio 2010(OpenMP)中并行化for循环

C 在Visual Studio 2010(OpenMP)中并行化for循环,c,multithreading,visual-studio-2010,for-loop,openmp,C,Multithreading,Visual Studio 2010,For Loop,Openmp,我最近阅读了有关OpenMP的文章,并试图将程序中的一些现有for循环并行化,以提高速度。然而,出于某种原因,我似乎得到了写入文件的垃圾数据。我的意思是,我没有将点1、2、3、4等写入我的文件,我有点1、4、7、8等。我怀疑这是因为我没有跟踪线程,这只会导致比赛条件 我一直在尽可能多地阅读OpenMP,因为它似乎是多线程编程的一个很好的抽象。如果有人能给我指点一下,我会很感激的,因为我可能做得不对 以下是我到目前为止一直在尝试做的事情(只有相关的代码): #包括 pixelIncrement=I

我最近阅读了有关OpenMP的文章,并试图将程序中的一些现有for循环并行化,以提高速度。然而,出于某种原因,我似乎得到了写入文件的垃圾数据。我的意思是,我没有将点1、2、3、4等写入我的文件,我有点1、4、7、8等。我怀疑这是因为我没有跟踪线程,这只会导致比赛条件

我一直在尽可能多地阅读OpenMP,因为它似乎是多线程编程的一个很好的抽象。如果有人能给我指点一下,我会很感激的,因为我可能做得不对

以下是我到目前为止一直在尝试做的事情(只有相关的代码):

#包括
pixelIncrement=Image.rowinc/2;
#pragma-omp并行
对于(int i=0;ipoints[k].x=x;
cloudObject->points[k].y=y;
cloudObject->points[k].z=z;
cloudObject->points[k].grayValue=grayValue;
fprintf(cloudpoints文件,“%f%f%f%d\n”、x、y、z、灰度值);
}
}
}
fclose(点文件);
我确实在编译器设置中启用了OpenMP(C/C++->Language->OpenMP支持(/OpenMP)


关于可能出现的问题有什么建议吗?我使用的是Windows XP 32位上的四核处理器。

是否所有点都写入文件,但不是按顺序写入的,或者实际点数据是否有误

在并行编程中,第一种情况是预期的——一旦并行执行某项任务,除非同步访问,否则就无法保证顺序(在这一点上,可以忽略并行化,因为它实际上是线性的).如果您需要依赖顺序,您可以并行化任何计算,但需要将其记录在一个线程中

如果点本身有问题,请检查变量的声明位置以及多个线程是否正在访问相同的变量。

这里有一些问题:

#pragma omp parallel for
for (int i = 0; i < Image.nrows; i++ )
   {
      int k =0;
      row     = Image.data + i * pixelIncrement;

      #pragma omp parallel for
      for (int j = 0; j < Image.ncols; j++)
      {
          k++; 
#pragma omp parallel for
对于(int i=0;i
对于,不需要内部的
并行。外部循环应该包含足够的功,以使所有内核保持忙碌


此外,对于内环,
k
是一个共享变量,并以非原子方式递增。
x
y
z
也在内环线程之间共享并“随机”覆盖。删除内部指令并查看它的运行情况。

如果有一个带有嵌套循环的循环,则不需要第二个omp pragma。 它已经并行化了第一个循环。请记住,只有当第二个循环必须按顺序执行时,这才有效。您有一个顺序递增,因此无法按随机顺序执行第二个循环。OMP pragmas是并行化代码的一种非常简单和酷的方法,但不要过多使用它们


此处的更多详细信息->

似乎您希望将“OpenMP”放在标题中。将
#omp atomic
放在
fprintf
行的正上方。您仍然无法以正确的顺序获取数据,但至少所有内容都应该在文件中。Hristo,您能详细说明一下您的意思吗“至少所有的东西都应该在档案里。"?我的意思是,
fprintf
不能保证线程安全,但在您的情况下,问题是所有定义在并行区域之外的变量都默认共享,并且您在竞态条件下遇到了问题。Femaref:实际点数据混乱。我理解同步时性能损失的含义nizing.#omp原子标记做得对吗?你能详细说明一下我如何限制线程不访问相同的变量吗?我编辑了我的帖子,以反映我为了允许它编译而不得不做的一个更改,我想这是因为我如何定义我的int k?出于某种原因,我似乎无法在for循环中成功定义2个int.我真的很想为(I=0,k=0;Ij
k
x
y
z
grayValue
,哪些是共享的-
thres按住
图像
云对象
云点文件
。请参阅Thank Tudor上的示例,但我仍然收到损坏的条目。我认为正如Brian所建议的,我需要仔细查看并控制所有传递的变量。。。
#pragma omp parallel for
for (int i = 0; i < Image.nrows; i++ )
   {
      int k =0;
      row     = Image.data + i * pixelIncrement;

      #pragma omp parallel for
      for (int j = 0; j < Image.ncols; j++)
      {
          k++;