工具/软件:TI C/C++编译器
我熟悉 TMS320C6678模块上的 OpenMP 和 MSMC 功能。
我是使用以下代码进行基准标记的人、当从 MSMC 分配数组时、我可以看到 OpenMP 并行化循环的运行速度要快得多。 我只是想知道、从硬件的角度来看、内存速度、可并行工作的通道数量等有何理由?
MSMC 频率是否比 DDR3好得多? 如果是多少钱? 下面是我用于基准测试的代码和输出。
任何评论都非常感谢。
e2e.ti.com/.../test_5F00_omp.zip
/*********
*文件:OMP_hello.c
*说明:
* OpenMP 示例- Hello World - C/C++版本
*在此简单示例中、主线程具有并行区域。
*小组中的所有线程都获得其唯一的线程编号并打印出来。
*主线程仅打印线程总数。 两
个 OpenMP *库例程用于获取线程数和每个
*线程数。
作者:Blaise Barney 5/99
*最后修订日期:04/06/05
/#include
#include
#include
#if defined (Compiler_GNU)
#include
#if defined (_OpenMP)
#include
#endif
#include
#define clock()((double) clock())
#elif defined (Compiler_C6x)
#if defined (_OpenMP)
#include
#endif
#include
#include
//#include
#include
#include
#include
#include
//#include
#include
#define clocks_per_sec 1e9
#define clock()((double)_itoll (TSCH、TSCL))
#endif
(cond)(msg、msg、param){}else{printf ("\n 错误、断言在文件中失败:'%s'位于行:%d:\n%s 请求的文件大小_、_param_b_ printf ("\n param =%d\n"、param);exit (1);}
#define buum_size (1024*10)
#define NUM_ITER (1)
typedef double mydt;
void process_some_data (mydt* buum_1、mydt* buum_2、mydt* buum_3){
int i、j;
对于(j = 0;j < NUM_ITER;j++)
对于(i = 0;i < buff _size;i++){
buff _3[i]= buff _1[i]* 3.2 +(buff _2[i])-93;
}
}
void omp_process_some_some_data (mydt* buum_1、mydt* buum_2、mydt* buum_3){
// int j;
// for (j = 0;j < NUM_ITER;j++)
//{
#pragma omp parallel num_threads(8)
{
int i;
的#pragma omp
对于(i = 0;i < buff _size;i++){
buff _3[i]= buff _1[i]* 3.2 +(buff _2[i])-93;
}
}
//}
}int main (){
#if defined (_OpenMP)
OMP_SET_num_threads(8);
#endif
mydt * DDR_buff、* DDR_buff、* DDR_buff;
int msize = buff _size* sizeof (mydt);
#if defined (Compiler_GNU)
DDR_buff = malloc (msize);
DDR_buff = malloc (msize);
DDR_buff = malloc (msize);
#elif defined (Compiler_C6x)
ERROR_Block EB;
ERROR_INIT (&EB);
ERROR_INIT (&EB);DDR_缓冲 区1 = Memory_alloc (NULL、msize、0、&EB);
ERROR_INIT (&EB);DDR_缓冲 区2 = Memory_alloc (NULL、msize、0、&EB);
ERROR_INIT (&EB);DDR_缓冲 区3 = Memory_alloc (NULL、msize、0、&EB);
#endif
assert(((int)DDR_buff!= 0,"无法分配内存! msize:"、msize);
assert(((int)DDR_buff!= 0,"无法分配内存! msize:"、msize);
assert(((int)DDR_buff!= 0,"无法分配内存! msize:"、msize);
#if defined (Compiler_C6x)
TSCH = 0;TSCL = 0;
long long start、end;
#elif defined (Compiler_GCC)
clock_t start、end;
#endif
start = clock();
Process_Some 数据(DDR_buff、DDR_buff、DDR_buff、DDR_buff);
end = clock();
printf ("DDR3处理时间:%f\n"、(double)(end-start)/clocks_per_sec);
start = clock();
OMP_process_some_data (DDR_buff、DDR_buff、DDR_buff、DDR_buff);
end = clock();
printf ("OMP DDR3处理时间:%f\n"、(double)(end-start)/clocks_per_sec);
#if defined (Compiler_C6x)
mydt * MSMC_buff、* MSMC_buff、* MSMC_buff;
ERROR_INIT (&EB);MSMC_buff 1 = Memory_alloc (msmcHeap、msize、0、&EB);
ERROR_INIT (&EB);MSMC_buff 2 = Memory_alloc (msmcHeap、msize、0、&EB);
ERROR_INIT (&EB);MSMC_buff 3 = Memory_alloc (msmcHeap、msize、0、&EB);
assert(((int)MSMC_buff!= 0,"无法分配内存! msize:"、msize);
assert(((int)MSMC_buff!= 0,"无法分配内存! msize:"、msize);
assert(((int)MSMC_buff!= 0,"无法分配内存! msize:"、msize);
start = clock();
Process_Some 数据(MSMC_buff、MSMC_buff、MSMC_buff);
end = clock();
printf ("MSMC 处理时间:%f\n"、(double)(end-start)/clocks_per_sec);
start = clock();
OMP_process_some_data (MSMC_buff、MSMC_buff、MSMC_buff、MSMC_buff);
end = clock();
printf ("OMP MSMC 处理时间:%f\n"、(double)(end-start)/clocks_per_sec);
#endif
return 0;
}
输出
DDR3处理时间:0.000195 OMP DDR3处理时间:0.000083 MSMC 处理时间:0.000191 OMP MSMC 处理时间:0.000026