Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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
Android-NDK-pthread多核_Android_Pthreads_Android Ndk_Tegra - Fatal编程技术网

Android-NDK-pthread多核

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;

我有一个很大的数组,在上面迭代和工作大约需要50毫秒。 我正在开发的应用程序将在tegra3或其他快速cpu上运行。 我已经将我的工作划分为四个线程,使用pthread,我已经 数组的宽度,除以系统中找到的总内核数,在每个线程中迭代数组的1/4,一切正常,但现在需要80ms来完成。 知道为什么多线程方法比单线程慢吗?如果我将cpu计数降低到1,则一切都恢复到50毫秒

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分辨率和更高的结果:)