我正在处理一小段代码,需要花费大量时间才能完成,所以我想用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
}
所有coordinates
和Point
的所有Point[x].Coord[y].Range == Point[z].Coord[y].Range
,x
和y
的{{1}}长度相同。 z
也是如此。
一些背景信息:在TypeOfCoord
循环的每次运行期间,对来自while
的两个随机抽取的Point
进行交互测试。 space
检查influencedBy()
和point1
是否足够接近彼此(距离取决于某个指标,但归结为point2
中的相似性。如果距离较小比distThres,交互是可能的)进行交互。交互意味着其中一个Coord
变量与另一个对象中相应的Coord
不等,将其翻转为等于它。这会缩短Coord
之间的距离,但也会更改Point
中已更改的point
与其他point
之间的距离,因此我的问题是这是否是多线程的。正如我所说的,我是多线程的全新手,我不确定我是否可以安全地实现一个能够实现这一目标的功能,所以我一直在寻找你的输入。建议也很受欢迎。
E:可以找到affectedby()函数(以及它依次调用的函数)here。我没有包含的函数,比如getFeature()和getNrFeatures()很小,不太可能贡献很多。请注意,我在这个问题中使用了对象的通用名称,但如果我在其他代码中替换它们,我可能会陷入困境或使其更加混乱,所以我在那里留下原始名称。记录:
Space
答案 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;?
之后立即