C和汇编的混合编程

时间:2022-02-23 19:26:19
我手头上的是C6000系列的开发板,出于对实时性的要求。需要在原来的代码上进行优化处理。。原来的代码是用纯C写的,但是主要的循环处理太耗时间了。现在想把其中的核心的代码改为汇编,利用DSP的8个并行工作的能力来提速。但是这两天网上也找了一些资料。。我对于这种混合编程的原理还是没有搞清楚。。。编译器为CCS.....首先,我想直接在C中嵌入的写汇编。。就是在原来的C代码的地方直接改为汇编,但是格式好像只能是asm(“ ”)这样。。这样好像不能使并行处理。也只能是串行的逐条指令处理这样。。不知我理解的正确与否?再次。。我就想把那个汇编语句和C分开写。。但是这样的话每次运行到一处需要改动汇编的地方就需要调用一个.sa文件。。感觉挺麻烦的。。而且这样下来这个.sa文件也应该不少。。。所以我想能不能用直接嵌入的方式,而且还能并行处理?请各路大神指教。。。。多谢!!!!

14 个解决方案

#1


不了解你这种CCS 编译器,也不了解你所说的并行是否vc中的多线程。
不过:
《intel 处理器》这本书中有不少 VC与汇编混合编程的例子,可以看看。

#2


引用 1 楼 hztj2005 的回复:
不了解你这种CCS 编译器,也不了解你所说的并行是否vc中的多线程。
不过:
《intel 处理器》这本书中有不少 VC与汇编混合编程的例子,可以看看。

恩。。多谢留言!并行的话其实就是DSP他能同时执行8条指令。。。我去看看这本书。。谢谢推介!!

#3


看对应C编译器是怎么支持嵌入asm的鸟。

#4


貌似在某本书看过 tc可以的

#5


该回复于2012-03-26 11:08:50被版主删除

#6


“利用DSP的8个并行工作的能力”这应该是类似sse之类的simd指令,一条指令处理多个数据,是数据处理级的并行,不是指令级的并行。你需要研究一下它的指令集手册,把你的数据处理部分转换成并行算法。

#7


刚看了一下TI的网站,TMS320C6678 - 多核定点和浮点数字信号处理器,8核心,可能你说的就是这个东西。这样的话,你需要把代码改成多线程的,每线程运行在一个核心上。

#8


引用 7 楼 delphiguy 的回复:
刚看了一下TI的网站,TMS320C6678 - 多核定点和浮点数字信号处理器,8核心,可能你说的就是这个东西。这样的话,你需要把代码改成多线程的,每线程运行在一个核心上。

额。。。可能是我一开始没有表达清楚吧。。恩。。TI的C6000系列的DSP好像是都有8个运算器,所以在同一时间内最多可以同时执行8条指令。但是如果用纯C去写代码的话,DSP的这种特性是无法体现出来的,也就没有利用到这款DSP的特性。现在我已经把纯C语句尽可能地优化了,但是还是无法达到能够实时的效果,因为要处理的图像的数据量很大,所以现在我想能用的办法就是把其中能同时执行的C语句转换为汇编来写。。来利用同时执行8条指令的特性。。但是我现在对这个汇编也是刚上手,最近虽然研究了一阵子,,但是真正动起手来还是不知如何去下手,所以我想如果有大神从事或者以前从事过这方面的研究的话,我想请教请教。。。

#9


非常感谢各位的关注!!

#10


引用 8 楼 zqcici 的回复:
额。。。可能是我一开始没有表达清楚吧。。恩。。TI的C6000系列的DSP好像是都有8个运算器,所以在同一时间内最多可以同时执行8条指令。但是如果用纯C去写代码的话,DSP的这种特性是无法体现出来的,也就没有利用到这款DSP的特性。现在我已经把纯C语句尽可能地优化了,但是还是无法达到能够实时的效果,因为要处理的图像的数据量很大,所以现在我想能用的办法就是把其中能同时执行的C语句转换为汇编来写。。来利用同时执行8条指令的特性。。但是我现在对这个汇编也是刚上手,最近虽然研究了一阵子,,但是真正动起手来还是不知如何去下手,所以我想如果有大神从事或者以前从事过这方面的研究的话,我想请教请教。。。


啊,这就是超标量优化了,你还是得研究指令集,以便尽可能达到8指令并行的效果,不优化的指令序列的并行度就较低,因为指令、数据的相关性。至于书写代码,还是串行的,没有什么特殊格式,只是在处理器上执行的时候,可以把连续的若干条指令并行。

#11


TI C6000采用的是VLIW结构,有相应的汇编代码可以实现指令的并行化,只需在需要并行执行的指令前加上‘||’,则表示这条指令和上面的指令在同一个时钟周期(CYCLE)内执行。

#12


引用 11 楼 masmaster 的回复:
TI C6000采用的是VLIW结构,有相应的汇编代码可以实现指令的并行化,只需在需要并行执行的指令前加上‘||’,则表示这条指令和上面的指令在同一个时钟周期(CYCLE)内执行。

额。。。。我想把其中的一些语句写成线性汇编,但是我对这个汇编语句不熟,譬如怎么把C中的if...else..语句在汇编中改写。。所以我想大神如果有相应的例程的话,可不可以提供让我学习学习,谢谢。。。

#13


引用 11 楼 masmaster 的回复:
TI C6000采用的是VLIW结构,有相应的汇编代码可以实现指令的并行化,只需在需要并行执行的指令前加上‘||’,则表示这条指令和上面的指令在同一个时钟周期(CYCLE)内执行。


原来如此。不过我感觉这个||只是告诉汇编器把若干指令打包成长指令,能不能并行,还得看指令间的相关性。

#14


引用 13 楼 delphiguy 的回复:
引用 11 楼 masmaster 的回复:

TI C6000采用的是VLIW结构,有相应的汇编代码可以实现指令的并行化,只需在需要并行执行的指令前加上‘||’,则表示这条指令和上面的指令在同一个时钟周期(CYCLE)内执行。


原来如此。不过我感觉这个||只是告诉汇编器把若干指令打包成长指令,能不能并行,还得看指令间的相关性。

如果是自己写的汇编程序的话,在语句前面加上||就是表示把这行语句和上一行语句并行处理,这个肯定是用到了不同的运算器和寄存器的。。而且语句之间肯定不能有相关性。。。不然编译的时候会报错的。:)

#1


不了解你这种CCS 编译器,也不了解你所说的并行是否vc中的多线程。
不过:
《intel 处理器》这本书中有不少 VC与汇编混合编程的例子,可以看看。

#2


引用 1 楼 hztj2005 的回复:
不了解你这种CCS 编译器,也不了解你所说的并行是否vc中的多线程。
不过:
《intel 处理器》这本书中有不少 VC与汇编混合编程的例子,可以看看。

恩。。多谢留言!并行的话其实就是DSP他能同时执行8条指令。。。我去看看这本书。。谢谢推介!!

#3


看对应C编译器是怎么支持嵌入asm的鸟。

#4


貌似在某本书看过 tc可以的

#5


该回复于2012-03-26 11:08:50被版主删除

#6


“利用DSP的8个并行工作的能力”这应该是类似sse之类的simd指令,一条指令处理多个数据,是数据处理级的并行,不是指令级的并行。你需要研究一下它的指令集手册,把你的数据处理部分转换成并行算法。

#7


刚看了一下TI的网站,TMS320C6678 - 多核定点和浮点数字信号处理器,8核心,可能你说的就是这个东西。这样的话,你需要把代码改成多线程的,每线程运行在一个核心上。

#8


引用 7 楼 delphiguy 的回复:
刚看了一下TI的网站,TMS320C6678 - 多核定点和浮点数字信号处理器,8核心,可能你说的就是这个东西。这样的话,你需要把代码改成多线程的,每线程运行在一个核心上。

额。。。可能是我一开始没有表达清楚吧。。恩。。TI的C6000系列的DSP好像是都有8个运算器,所以在同一时间内最多可以同时执行8条指令。但是如果用纯C去写代码的话,DSP的这种特性是无法体现出来的,也就没有利用到这款DSP的特性。现在我已经把纯C语句尽可能地优化了,但是还是无法达到能够实时的效果,因为要处理的图像的数据量很大,所以现在我想能用的办法就是把其中能同时执行的C语句转换为汇编来写。。来利用同时执行8条指令的特性。。但是我现在对这个汇编也是刚上手,最近虽然研究了一阵子,,但是真正动起手来还是不知如何去下手,所以我想如果有大神从事或者以前从事过这方面的研究的话,我想请教请教。。。

#9


非常感谢各位的关注!!

#10


引用 8 楼 zqcici 的回复:
额。。。可能是我一开始没有表达清楚吧。。恩。。TI的C6000系列的DSP好像是都有8个运算器,所以在同一时间内最多可以同时执行8条指令。但是如果用纯C去写代码的话,DSP的这种特性是无法体现出来的,也就没有利用到这款DSP的特性。现在我已经把纯C语句尽可能地优化了,但是还是无法达到能够实时的效果,因为要处理的图像的数据量很大,所以现在我想能用的办法就是把其中能同时执行的C语句转换为汇编来写。。来利用同时执行8条指令的特性。。但是我现在对这个汇编也是刚上手,最近虽然研究了一阵子,,但是真正动起手来还是不知如何去下手,所以我想如果有大神从事或者以前从事过这方面的研究的话,我想请教请教。。。


啊,这就是超标量优化了,你还是得研究指令集,以便尽可能达到8指令并行的效果,不优化的指令序列的并行度就较低,因为指令、数据的相关性。至于书写代码,还是串行的,没有什么特殊格式,只是在处理器上执行的时候,可以把连续的若干条指令并行。

#11


TI C6000采用的是VLIW结构,有相应的汇编代码可以实现指令的并行化,只需在需要并行执行的指令前加上‘||’,则表示这条指令和上面的指令在同一个时钟周期(CYCLE)内执行。

#12


引用 11 楼 masmaster 的回复:
TI C6000采用的是VLIW结构,有相应的汇编代码可以实现指令的并行化,只需在需要并行执行的指令前加上‘||’,则表示这条指令和上面的指令在同一个时钟周期(CYCLE)内执行。

额。。。。我想把其中的一些语句写成线性汇编,但是我对这个汇编语句不熟,譬如怎么把C中的if...else..语句在汇编中改写。。所以我想大神如果有相应的例程的话,可不可以提供让我学习学习,谢谢。。。

#13


引用 11 楼 masmaster 的回复:
TI C6000采用的是VLIW结构,有相应的汇编代码可以实现指令的并行化,只需在需要并行执行的指令前加上‘||’,则表示这条指令和上面的指令在同一个时钟周期(CYCLE)内执行。


原来如此。不过我感觉这个||只是告诉汇编器把若干指令打包成长指令,能不能并行,还得看指令间的相关性。

#14


引用 13 楼 delphiguy 的回复:
引用 11 楼 masmaster 的回复:

TI C6000采用的是VLIW结构,有相应的汇编代码可以实现指令的并行化,只需在需要并行执行的指令前加上‘||’,则表示这条指令和上面的指令在同一个时钟周期(CYCLE)内执行。


原来如此。不过我感觉这个||只是告诉汇编器把若干指令打包成长指令,能不能并行,还得看指令间的相关性。

如果是自己写的汇编程序的话,在语句前面加上||就是表示把这行语句和上一行语句并行处理,这个肯定是用到了不同的运算器和寄存器的。。而且语句之间肯定不能有相关性。。。不然编译的时候会报错的。:)