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

相同代码在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 vue使用gojs,需求在link中的虚线上添加方向箭头
  • ¥15 CSS通配符清除内外边距为什么可以覆盖默认样式?
  • ¥15 SPSS分类模型实训题步骤
  • ¥15 求解决扩散模型代码问题
  • ¥15 工创大赛太阳能电动车项目零基础要学什么
  • ¥20 limma多组间分析最终p值只有一个
  • ¥15 nopCommerce开发问题
  • ¥15 torch.multiprocessing.spawn.ProcessExitedException: process 1 terminated with signal SIGKILL
  • ¥15 QuartusⅡ15.0编译项目后,output_files中的.jdi、.sld、.sof不更新怎么解决
  • ¥15 pycharm输出和导师的一样,但是标红