相同代码在ARM平台使用openMP多线程比单线程慢,但是在x86平台多线程明显快于单线程

X86平台:


Intel i5-8500@3.00GHz x 6 (6核处理器)


Ubuntu16.04 64bit操作系统 16G RAM


gcc 5.4.0


ARM平台:


瑞芯微RK3399Pro


双核cortex-a72&&四核cortex-a53


aarch64 4G RAM


gcc 8.3.1


代码如下(功能是对内存块进行初始化):

#include <iostream>
#include <sys/time.h>

int main()
{
    int size = 8274240;
    int* data = new int[size];

    struct timeval start, end;
    gettimeofday(&start, NULL);
    #pragma omp parallel for num_threads(2)
    for(int i=0; i<size; i+=4)
    {
        data[i] = 0;
        data[i+1] = 0;
        data[i+2] = 0;
        data[i+3] = 0;
    }
    gettimeofday(&end, NULL);
    std::cout << "[Time] memset use time: "<<float((end.tv_sec-start.tv_sec))*1000+float((end.tv_usec-start.tv_usec))/1000 << " ms" << std::endl;

    return 0;
}


问题:


在X86平台,设置2个线程耗时几乎是单线程的一半 (设置更多的线程加速效果不再明显,甚至耗时更多)


但是在ARM平台,设置多线程始终比单线程要慢(设置线程越多越慢)。


刚学openMP和高性能计算,求解答。。。


另外是否可以用类似perf工具分析性能瓶颈?

1个回答

这个和内存锁定的模式可能有关系。我不是很了解arm和泥的os内核,但是可能arm上的内存竞争机制妨害了这种数组的访问。你可以尝试将for循环拆成访问多个2维数组,每个线程操作一个连续的地址,彼此不要重叠。
用一些工具看下cpu的占用。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问