DSP Testi

Bu bölümde daha önce derlediğimiz örnek uygulamaları nasıl çalıştıracağımıza bakacağız.

Daha önce C6Run içindeki örnekleri derleyip bir dizinde saklamıştık. Bu dizinin içereğini tekrar hatırlayalım.

# ls /tmp/examples/
cmemk.ko  dsplinkk.ko  examples  loadmodules.sh  test  unloadmodules.sh

2 adet çekirdek modülünün, örnekleri içeren examples dizinin, ayrıca modülleri yüklemek ve kaldırmak için, loadmodules.sh, unloadmodules.sh isimli betiklerin bulunduğunu görmekteyiz.

C6Run modüllerinin belleğin neresini kullanacakları önem taşımaktadır. Modüllerin bellekte kullanacakları alanın başlangıç ve bitiş adresleri derleme zamanında değiştirilebileği gibi yükleme zamanında da belirtilebilir. Biz burada öngörülen değerleri kullanacağız. loadmodules.h dosyasında bu adresler aşağıdaki gibi gösterilmektedir.

DSP_REGION_START_ADDR="0xC2000000"
DSP_REGION_END_ADDR="0xC4000000"

Hawkboard için çekirdek kodu ise 0xC000000 adresinden başlamaktadır, çekirdeğin DSP modülleri için ayrılmış alana taşmasını önlemek için çekirdeği kullandığı alanı, modüllerin başlangıç adresi olan, 0xC2000000 adresinde sonlandırmalıyız.

Bu durumda çekirdek 0xC000000 ile 0xC2000000 arasında bulunmalıdır, çekirdek için ayrılan alan 0x2000000 yani 32M olmalıdır. Çekirdeğin bu bölgeyi kullanmasını sağlamak için çekirdeğe mem=32M boot argümanı geçirilmelidir. Bu işlem U-Boot üzerinden aşağıdaki gibi yapılabilir.

setenv bootargs "console=ttyS2,115200 mem=32M init=/bin/sh root=/dev/mtdblock4 rootwait rootfstype=jffs2"

loadmodules.sh ile gerekli modülleri yükledikten sonra, proje içinden çıkan ya da kendi derlediğiniz test uygulamalarınızı çalıştırabilirsiniz.

ARM ve DSP hedefli derlenen FFT uygulamaları için elde ettiğimiz sonuçlar aşağıdaki gibidir.

# ./cfft_arm
N=16,nTimes=100: 0.007027 s
N=32,nTimes=100: 0.017506 s
N=64,nTimes=100: 0.04224 s
N=128,nTimes=100: 0.098568 s                                      
N=256,nTimes=100: 0.226512 s                                    
N=512,nTimes=100: 0.510898 s                                    
N=1024,nTimes=100: 1.15786 s                                      
N=2048,nTimes=100: 2.61276 s                                      
N=4096,nTimes=100: 5.8848 s
N=8192,nTimes=100: 12.8365 s
N=16384,nTimes=100: 27.6982 s

# ./cfft_dsp
N=16,nTimes=100: 0.056423 s
N=32,nTimes=100: 0.055537 s
N=64,nTimes=100: 0.058968 s
N=128,nTimes=100: 0.059059 s
N=256,nTimes=100: 0.06587 s
N=512,nTimes=100: 0.080403 s
N=1024,nTimes=100: 0.107609 s
N=2048,nTimes=100: 0.168634 s
N=4096,nTimes=100: 0.302576 s
N=8192,nTimes=100: 0.619787 s
N=16384,nTimes=100: 1.33111 s

Kullandığınız DSP modülünün sabit (fixed point) ya da kayan noktalı (floating point) oluşuna göre bu sonuçlar değişecektir. Ayrıca ARM tarafından DSP modülüne yapılan çağrılar maliyetli olduğundan mümkün olduğunca az çağrı yaparak, çağrı başına daha fazla işlem yapmak daha uygun olacaktır.

results matching ""

    No results matching ""