Android-NDK-pthread多核
我有一个很大的数组,在上面迭代和工作大约需要50毫秒。 我正在开发的应用程序将在tegra3或其他快速cpu上运行。 我已经将我的工作划分为四个线程,使用pthread,我已经 数组的宽度,除以系统中找到的总内核数,在每个线程中迭代数组的1/4,一切正常,但现在需要80ms来完成。 知道为什么多线程方法比单线程慢吗?如果我将cpu计数降低到1,则一切都恢复到50毫秒Android-NDK-pthread多核,android,pthreads,android-ndk,tegra,Android,Pthreads,Android Ndk,Tegra,我有一个很大的数组,在上面迭代和工作大约需要50毫秒。 我正在开发的应用程序将在tegra3或其他快速cpu上运行。 我已经将我的工作划分为四个线程,使用pthread,我已经 数组的宽度,除以系统中找到的总内核数,在每个线程中迭代数组的1/4,一切正常,但现在需要80ms来完成。 知道为什么多线程方法比单线程慢吗?如果我将cpu计数降低到1,则一切都恢复到50毫秒 for(int y = 0; y<height;y++) { for(int x = 0; x<width;
for(int y = 0; y<height;y++)
{
for(int x = 0; x<width; x++)
{
int index = (y*width)+x;
int sourceIndex = source->getIndex(vertex_points[index].position[0]/ww, vertex_points[index].position[1]/hh);
vertex_points[index].position[0]+=source->x[sourceIndex]*ww;
vertex_points[index].position[1]+=source->y[sourceIndex]*hh;
}
};
for(int y=0;yx[sourceIndex]*ww;
顶点_点[index]。位置[1]+=source->y[sourceIndex]*hh;
}
};
我根据cpu计数将上述代码的第一个for循环划分为四个部分。
顶点_点是具有位置的向量
看来
for(int y=start;y<end;y++)
for(int y=start;y线程启动时间通常以毫秒为单位-这就是消耗时间的原因
考虑到这一点,50毫秒并不是我所担心的那种延迟。如果我们说的是5秒,那将是一个很好的平行化候选
如果需要经常执行循环,考虑一个线程的解决方案,这些线程早就被线程化并保持休眠,等待工作完成。
另外,CPU真的是4核吗?诚实内核还是超线程?为什么你有4个线程?Android不是设计成多线程系统的,整个GUI方面实际上都在一个线程上。从多线程的角度跟踪事件所涉及的额外复杂性会让Rominguy,DianneHack出生时,JBQ发誓说“没有明天”,考虑如何在多线程体系结构上跟踪刷新屏幕、接收广播。这就是为什么强烈建议在后台使用线程,以免占用GUI的单个线程。@t0mm13b为什么你要输入一些没有添加到答案中的名称(这与问题无关)@Alex-他们是AOSP背后的工程师来源:)我想说的是,多核是没有效率的,因为Android不知道如何利用它。它的nexus7和tegra 3,所以看起来它有4个:)因此,如果线程启动需要花费很多时间,那么最好从一开始就启动线程,然后像你说的那样,每帧调用一次来完成任务,我会尝试这种方法,50毫秒是一种延迟,因为它是opengl应用程序:)我需要在模拟中移动很多对象,只需添加两个值就很容易了,但它们很多,所以这需要一些时间,这就是为什么我想尝试将其复制,以便获得更大的sim分辨率和更高的结果:)