引入OpenMP后,可以使程序部分并行化。每个核拷贝一份共享的变量,到自己的存储空间(threadprivate memory)进行运算,最后再写回。我觉得比较好的做法是每个thread共享指向堆区的一个指针,这样可以减少数据的搬运,而让每个thread都能对数据进行独立的修改。
原本的单核程序可能是在L2和MSMC上运行,而使用OpenMP的程序可能受到空间限制,把程序放在DDR上运行,这样就会慢很多,反而起不到加速的效果。而每个核之间的同步也有额外的开销,所以加速效果可能达不到预期。
实际测试发现,如果在platform里直接设置L2 Cache,OpenMP可能都跑不通,会出现任务栈溢出的错误。后来我就没有在platform上直接设置L2 Cache,而是在运行的过程中设置L2 Cache,这样做的效果也不是很理想。在DDR上开辟堆区,如果没有L2 Cache实际计算的效率非常低。源操作数和目的操作数均位于DDR上,我用4核OpenMP+L2 Cache计算8000次浮点乘法,平均每次用时80ns;而用单核+L2 Cache仅需3点几个ns。所以如果是想加速算法,真的不建议用OpenMP。
再Linux下使用gcc编译器,O2优化,编译出的
openmp并行比不用
openmp的串行程序还要慢。然后换了intel2020的icc编译器,原有程序的基础上使用icc编译,发现速度提升飞快,比串行快了大约8s,由于我的程序中并行for循环使用并不是很多,所以效果不是很明显,但解决了并行效率低的问题。
另外gcc是免费的,icc是收费的而且装好要20多个G以上,据说icc的bug比较多。
教程目录:http://blog.csdn.net/tostq/article/details/51245979
本节我们将运行第一个多核DSP程序,熟悉CCS开发环境,学会使用CCS调试工具,主要内容如下:
(1)新建CCS项目
(2)导入Target 仿真模块
(3)使用调试工具
一、新建CCS项目
选择File/New/CCS Project
二、新建项目对话框
int layer_for = 2;
int each_task_size_for = 100000 / 20;
int num_threads = omp_get_max_threads();
// int num_threads_limit = omp_get_thread_limit();//编不过?
printf("多线程:%d\t%d\n", num_threads);
omp_set_num_threads(num_threads);
#pragma omp parallel num_th..
一. 这么学DSP比较有效
在开始C6678的架构讲解之前,我想拉出一点篇幅,给大家谈一下,根据我个人的理解,怎么样才能比较快的学好DSP。
(1)学习DSP,首先要与学MCU区分开,毕竟这是两个完全不同的架构,而且DSP与MCU的设计思路完全不一样。MCU是为通用的控制而设计,DSP则是专为高速应用而设计;
(2)从硬件的角度来考虑,要玩转DSP,首先需要仔细阅读其数据手册和用户指南。数据手册中,重点阅读DSP的技术指标,最关键的是对芯片的电源需求做详细的了解,其中对核电压的需求一定要认真了解,这是DSP
IPC是SYS/BIOS处理核间通信的组件
IPC的几种应用方式(下面中文名字是自行翻译,旁边有英文=_=||,另外下面的配图中的蓝色表示需要调用模块的APIs,而红色模块表示仅仅需要配置(如在.cfg中配置),而灰色模块表示是非必须的):
(1)最小使用(Minimal use):这种情况是通过核间的通知机制(notification)来实施的.
b'
OpenMP在Linux上的使用方式是什么?'
OpenMP是一种并行编程的API,可以在共享内存系统中进行并行计算。在Linux上使用
OpenMP可以先安装支持
OpenMP的编译器(如GCC),然后通过编译时加上编译选项“-f
openmp”来开启
OpenMP的支持。在程序中可以使用pragma语句指定并行化的区域,例如#pragma omp parallel和#pragma omp for等。通过这些指令,程序能够自动利用多个CPU核心进行并行计算,提高程序的性能。
### 回答2:
### 回答3: