This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件: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
MSMC 始终比 EMIF 更快、因为它是片上存储器、与 DDR 相比、可被视为片上 L3存储器并更接近 DSP 内核
MSMC 在 C6678器件上以 CPU 的1/2速度运行。 DDR 最高可达1333/1666、即 DDR 时钟将为667/800 MHz
有关内存吞吐量性能、请参阅:
此致、
Rahul
您好、Rahul、
非常感谢 您的回答。
[引用用户="Rahul Prabhu"]
MSMC 在 C6678器件上以 CPU 的1/2速度运行。 DDR 最高可达1333/1666、即 DDR 时钟将为667/800 MHz
[/报价]
1/2表示“一次或两次”正确? 与 667/800 MHz 相同? (愚蠢的确认:D,但我需要它)
[引用用户="Rahul Prabhu"]
有关内存吞吐量性能、请参阅:
[/报价]
1)当代码在 TMS320C6678上运行时、是否 通过 EDMA 在堆(是否为 MSMC/DDR3)和 D-Cache L1之间隐式传输数组数据??? 或者、您只需在此处指出一点、即在 MSMC 受限的情况下、应将 EDMA 视为替代方案??
2) 2) MSMC 是否支持从 TMS320C6678中的8个内核中的每个内核进行并发访问(RW)? 如果是,这在使用 OpenMP 时是否会受益?
此致