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

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

  • threenewbee 2019-12-09 15:55
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大