C ++:不确定代码是否是多线程的

时间:2014-04-16 13:37:11

标签: c++ multithreading opencl gpgpu

我正在处理一小段代码,需要花费大量时间才能完成,所以我想用pthread进行多线程处理(我很难理解,但我认为我可以更快地掌握它)或者有一些GPGPU实现(可能是OpenCL,因为我家里有一张AMD卡,我在办公室使用的PC有各种NVIDIA卡)

   while(sDead < (unsigned long) nrPoints*nrPoints) {

    pPoint1 = distrib(*rng);
    pPoint2 = distrib(*rng);

    outAxel = -1;

    if(pPoint1 != pPoint2) {

      point1 = space->getPointRef(pPoint1);
      point2 = space->getPointRef(pPoint2);

      outAxel = point1->influencedBy(point2, distThres);

      if(outAxel == 0 || outAxel == 1)
    sDead++;
      else
    sDead = 0;

    }

    i++;
  }

其中distrib是uniform_int_distribution,a = 0且b = nrPoints-1。 为清楚起见,这是我正在使用的结构:

class Space{
  vector<Point> points
  (more stuff)
}

class Point {
  vector<Coords> coordinates
  (more stuff)
}

struct Coords{
  char Range
  bool TypeOfCoord
  char Coord
}

所有coordinatesPoint的所有Point[x].Coord[y].Range == Point[z].Coord[y].Rangexy的{​​{1}}长度相同。 z也是如此。

一些背景信息:在TypeOfCoord循环的每次运行期间,对来自while的两个随机抽取的Point进行交互测试。 space检查influencedBy()point1是否足够接近彼此(距离取决于某个指标,但归结为point2中的相似性。如果距离较小比distThres,交互是可能的)进行交互。交互意味着其中一个Coord变量与另一个对象中相应的Coord不等,将其翻转为等于它。这会缩短Coord之间的距离,但也会更改Point中已更改的point与其他point之间的距离,因此我的问题是这是否是多线程的。正如我所说的,我是多线程的全新手,我不确定我是否可以安全地实现一个能够实现这一目标的功能,所以我一直在寻找你的输入。建议也很受欢迎。

E:可以找到affectedby()函数(以及它依次调用的函数)here。我没有包含的函数,比如getFeature()和getNrFeatures()很小,不太可能贡献很多。请注意,我在这个问题中使用了对象的通用名称,但如果我在其他代码中替换它们,我可能会陷入困境或使其更加混乱,所以我在那里留下原始名称。记录:

Space

1 个答案:

答案 0 :(得分:1)

(选择&#34;答案&#34;因为格式允许更好的演示。不完全是你要求的,但让我们首先澄清这一点。)

<强>后来

在此条件成立之前,循环的执行频率是多少?

while(sDead < (unsigned long) nrPoints*nrPoints) {

可能不是一个很大的收获,但是:

pPoint1 = distrib(*rng);
do {
   pPoint2 = distrib(*rng);
while( pPoint1 == pPoint2 );


outAxel = -1;

getPointRef的成本有多高? Space中的线性搜索?

point1 = space->getPointRef(pPoint1);
point2 = space->getPointRef(pPoint2);

outAxel = point1->influencedBy(point2, distThres);

是否真的有必要重新计算变化点与空间中每个其他点之间的距离&#34;在&#34;翻转&#34;?

之后立即