Kevin_Hee
小夕nike
2019-12-09 15:40
采纳率: 50%
浏览 731

相同代码在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条回答 默认 最新

  • caozhy
    已采纳

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

    点赞 评论

相关推荐