TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

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.

[参考译文] 编译器/TMS320C6678:MSMC 与 DDR3速度型和通道/访问型有何不同?

Guru**** 2046970 points
Other Parts Discussed in Thread: TMS320C6678
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/942525/compiler-tms320c6678-how-different-is-msmc-vs-ddr3-speed-wise-and-channel-access-wise

器件型号:TMS320C6678

工具/软件: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

    有关内存吞吐量性能、请参阅:

    C66x Keystone 吞吐量应用手册  

    此致、

    Rahul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Rahul、

    非常感谢 您的回答。

    [引用用户="Rahul Prabhu"]

    MSMC 在 C6678器件上以 CPU 的1/2速度运行。 DDR 最高可达1333/1666、即 DDR 时钟将为667/800 MHz

    [/报价]

    1/2表示“一次或两次”正确? 与  667/800 MHz 相同? (愚蠢的确认:D,但我需要它)

    [引用用户="Rahul Prabhu"]

    有关内存吞吐量性能、请参阅:

    C66x Keystone 吞吐量应用手册  

    [/报价]

    1)当代码在 TMS320C6678上运行时、是否 通过 EDMA 在堆(是否为 MSMC/DDR3)和 D-Cache L1之间隐式传输数组数据??? 或者、您只需在此处指出一点、即在 MSMC 受限的情况下、应将 EDMA 视为替代方案??  

    2) 2) MSMC 是否支持从 TMS320C6678中的8个内核中的每个内核进行并发访问(RW)? 如果是,这在使用 OpenMP 时是否会受益?

    此致