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

相同代码在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的占用。

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

报告相同问题?

悬赏问题

  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝