[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r7651 - in gnuradio/branches/developers/ngoergen: . sp
From: |
ngoergen |
Subject: |
[Commit-gnuradio] r7651 - in gnuradio/branches/developers/ngoergen: . spe_fir_fff |
Date: |
Wed, 13 Feb 2008 08:32:13 -0700 (MST) |
Author: ngoergen
Date: 2008-02-13 08:32:13 -0700 (Wed, 13 Feb 2008)
New Revision: 7651
Added:
gnuradio/branches/developers/ngoergen/spe_fir_fff/
gnuradio/branches/developers/ngoergen/spe_fir_fff/Makefile
gnuradio/branches/developers/ngoergen/spe_fir_fff/fir_fff_spe.cpp
gnuradio/branches/developers/ngoergen/spe_fir_fff/gr_spe_dma_lock.h
gnuradio/branches/developers/ngoergen/spe_fir_fff/multi_fir_fff_ppe.c
gnuradio/branches/developers/ngoergen/spe_fir_fff/spe_fir_fff_params.h
gnuradio/branches/developers/ngoergen/spe_fir_fff/src/
Modified:
gnuradio/branches/developers/ngoergen/
Log:
branches/developers/ngoergen: initial commit of spe/simd dot-product primitive
for the fff fir filter. Inner loop only, still requires work for alignment and
scheduling analysis.
Property changes on: gnuradio/branches/developers/ngoergen
___________________________________________________________________
Name: svn:ignore
+ .cproject
.project
Property changes on: gnuradio/branches/developers/ngoergen/spe_fir_fff
___________________________________________________________________
Name: svn:ignore
+ *.elf
multi_fir_fff_ppe
Added: gnuradio/branches/developers/ngoergen/spe_fir_fff/Makefile
===================================================================
--- gnuradio/branches/developers/ngoergen/spe_fir_fff/Makefile
(rev 0)
+++ gnuradio/branches/developers/ngoergen/spe_fir_fff/Makefile 2008-02-13
15:32:13 UTC (rev 7651)
@@ -0,0 +1,20 @@
+CC = gcc
+CINCS = -I.
+CLIBS = -lspe2 -pthread
+CFLAGS = -Wall
+
+SPU_CC = spu-gcc
+SPU_CINCS = -I.
+SPU_CLIBS =
+SPU_CFLAGS = -Wall
+
+all: multi_fir_fff_ppe fir_fff_spe.elf
+
+multi_fir_fff_ppe: multi_fir_fff_ppe.c
+ $(CC) $(CFLAGS) $(CINCS) $(CLIBS) $^ -o $@
+
+fir_fff_spe.elf: fir_fff_spe.cpp
+ $(SPU_CC) $(SPU_CFLAGS) $(SPU_CINCS) $(SPU_CLIBS) $^ -o $@
+
+clean:
+ rm -f multi_fir_fff_ppe fir_fff_spe.elf
Property changes on: gnuradio/branches/developers/ngoergen/spe_fir_fff/Makefile
___________________________________________________________________
Name: svn:executable
+ *
Added: gnuradio/branches/developers/ngoergen/spe_fir_fff/fir_fff_spe.cpp
===================================================================
--- gnuradio/branches/developers/ngoergen/spe_fir_fff/fir_fff_spe.cpp
(rev 0)
+++ gnuradio/branches/developers/ngoergen/spe_fir_fff/fir_fff_spe.cpp
2008-02-13 15:32:13 UTC (rev 7651)
@@ -0,0 +1,83 @@
+#include <stdio.h>
+#include <spu_intrinsics.h>
+#include "gr_spe_dma_lock.h"
+#include "spe_fir_fff_params.h"
+
+#define MAX_BUFSIZE (128*100)
+
+float in1_spe[MAX_BUFSIZE] __attribute__((aligned(16)));
+float in2_spe[MAX_BUFSIZE] __attribute__((aligned(16)));
+float out_spe[MAX_BUFSIZE] __attribute__((aligned(16)));
+//float out_spe[MAX_BUFSIZE] __attribute__((aligned(16)));
+
+spe_fir_fff_params_t spe_fir_fff_params __attribute__((aligned(16)));
+
+
+int main(unsigned long long spe, unsigned long long argp, unsigned long long
envp)
+{
+ int tag = 1;
+ __vector float *vin1 = (__vector float *) in1_spe;
+ __vector float *vin2 = (__vector float *) in2_spe;
+ __vector float *vout = (__vector float *) out_spe;
+
+ //asm(".test1\n");
+ //unsigned int b = spe_fir_fff_params.ntaps;
+ //unsigned int c = spe_fir_fff_params.size;
+ //asm(".test2\n");
+
+ {
+ gr_spe_dma_lock_in<spe_fir_fff_params_t> argp_lock(
+ argp, &spe_fir_fff_params, sizeof(spe_fir_fff_params_t), tag);
+ gr_spe_dma_lock_in<__vector float> vin1_lock(
+ spe_fir_fff_params.ea_in1, vin1, spe_fir_fff_params.size *
sizeof(float), tag);
+ gr_spe_dma_lock_in<__vector float> vin2_lock(
+ spe_fir_fff_params.ea_in2, vin2, spe_fir_fff_params.size *
sizeof(float), tag);
+ gr_spe_dma_lock_out<__vector float> out_lock(
+ spe_fir_fff_params.ea_out, vout, spe_fir_fff_params.size *
sizeof(float), tag);
+
+ asm(
+
+ " xor $5,$5,$5 \n" // even
+ " lqd $2,64($sp) \n" // odd
+ " xor $6,$6,$6 \n"
+ " lqd $3,48($sp) \n"
+ " xor $7,$7,$7 \n"
+ " lqr $9,spe_fir_fff_params+16 \n"
+ " xor $8,$8,$8 \n"
+ " rotqbyi $9,$9,12 \n"
+ " rotqbyi $20,$9,12 \n"
+ ".big_mama_loop: \n"
+ " lqd $10,0($2) \n"
+ " ai $2,$2,64 \n"
+ " lqd $14,0($3) \n"
+ " fma $5, $10, $14, $5 \n" // even
+ " lqd $11,16($2) \n"
+ " ai $3,$3,64 \n"
+ " lqd $15,16($3) \n"
+ " fma $6, $11, $15, $6 \n" // even
+ " lqd $12,32($2) \n"
+ " ai $9,$9,-4 \n"
+ " lqd $16,32($3) \n"
+ " fma $7, $12, $16, $7 \n" // even
+ " lqd $13,48($2) \n"
+ " lqd $17,48($3) \n"
+ " fma $8, $13, $17, $8 \n" // even
+ " brnz $9,.big_mama_loop \n"
+ " fa $18,$5,$6 \n"
+ " fa $19,$7,$8 \n"
+ " fa $5,$18,$19 \n"
+
+ " ori $6,$5,0 \n"
+ " shlqbyi $6,$6,4 \n"
+ " fa $5,$6,$5 \n"
+ " shlqbyi $6,$6,4 \n"
+ " fa $5,$6,$5 \n"
+ " shlqbyi $6,$6,4 \n"
+ " fa $5,$6,$5 \n"
+ " lqd $9,32($sp) \n"
+ " stqd $5,0($9) \n"
+ );
+ }
+
+ return 0;
+}
Property changes on:
gnuradio/branches/developers/ngoergen/spe_fir_fff/fir_fff_spe.cpp
___________________________________________________________________
Name: svn:executable
+ *
Added: gnuradio/branches/developers/ngoergen/spe_fir_fff/gr_spe_dma_lock.h
===================================================================
--- gnuradio/branches/developers/ngoergen/spe_fir_fff/gr_spe_dma_lock.h
(rev 0)
+++ gnuradio/branches/developers/ngoergen/spe_fir_fff/gr_spe_dma_lock.h
2008-02-13 15:32:13 UTC (rev 7651)
@@ -0,0 +1,77 @@
+#ifndef GR_SPE_DMA_LOCK_H_
+#define GR_SPE_DMA_LOCK_H_
+
+#include <spu_mfcio.h>
+
+template <class Tout>
+class gr_spe_dma_lock {
+public:
+ gr_spe_dma_lock(unsigned long long in, Tout* target, unsigned int size,
int tag) :
+ d_in(in), d_target(target), d_size(size), d_tag(tag) {
+ }
+
+ ~gr_spe_dma_lock() {};
+
+protected:
+ void pull() {
+ spu_mfcdma64(d_target, mfc_ea2h(d_in), mfc_ea2l(d_in),
+ d_size, d_tag, MFC_GET_CMD);
+ spu_writech(MFC_WrTagMask, 1 << d_tag);
+ spu_mfcstat(MFC_TAG_UPDATE_ALL);
+ }
+
+ void push() {
+ spu_mfcdma64(d_target, mfc_ea2h(d_in), mfc_ea2l(d_in), d_size,
d_tag, MFC_PUT_CMD);
+ spu_writech(MFC_WrTagMask, 1 << d_tag);
+ spu_mfcstat(MFC_TAG_UPDATE_ALL);
+ }
+
+private:
+ unsigned long long d_in;
+ Tout* d_target;
+ unsigned int d_size;
+ int d_tag;
+};
+
+template <class Tout>
+class gr_spe_dma_lock_in : gr_spe_dma_lock<Tout> {
+public:
+ gr_spe_dma_lock_in(unsigned long long in, Tout* target, unsigned int
size, int tag) :
+ gr_spe_dma_lock<Tout>(in, target, size, tag) {
+ pull();
+ }
+
+ void pull() { gr_spe_dma_lock<Tout>::pull(); }
+
+ ~gr_spe_dma_lock_in() {}
+};
+
+template <class Tout>
+class gr_spe_dma_lock_out : gr_spe_dma_lock<Tout> {
+public:
+ gr_spe_dma_lock_out(unsigned long long in, Tout* target, unsigned int
size, int tag) :
+ gr_spe_dma_lock<Tout>(in, target, size, tag) {
+ }
+
+ void push() { gr_spe_dma_lock<Tout>::push(); }
+
+ ~gr_spe_dma_lock_out() { push(); }
+};
+
+template <class Tout>
+class gr_spe_dma_lock_inout : gr_spe_dma_lock<Tout> {
+public:
+ gr_spe_dma_lock_inout(unsigned long long in, Tout* target, unsigned int
size, int tag) :
+ gr_spe_dma_lock<Tout>(in, target, size, tag) {
+ pull();
+ }
+
+ void push() { gr_spe_dma_lock<Tout>::push(); }
+
+ void pull() { gr_spe_dma_lock<Tout>::pull(); }
+
+ ~gr_spe_dma_lock_inout() { push(); }
+};
+
+
+#endif /*GR_SPE_DMA_LOCK_H_*/
Added: gnuradio/branches/developers/ngoergen/spe_fir_fff/multi_fir_fff_ppe.c
===================================================================
--- gnuradio/branches/developers/ngoergen/spe_fir_fff/multi_fir_fff_ppe.c
(rev 0)
+++ gnuradio/branches/developers/ngoergen/spe_fir_fff/multi_fir_fff_ppe.c
2008-02-13 15:32:13 UTC (rev 7651)
@@ -0,0 +1,184 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <libspe2.h>
+#include <pthread.h>
+#include <spe_fir_fff_params.h>
+
+#define NUM_SPE 1
+#define SIZE (64*10 )
+
+//#define MYMATRIX 1, 2, 3, 4, 5, 6, 7, 8, \
+ 9, 10, 11, 12, 13, 14, 15, 16, \
+ 17, 18, 19, 20, 21, 22, 23, 24, \
+ 25, 26, 27, 28, 29, 30, 31, 32, \
+ 33, 34, 35, 36, 37, 38, 39, 40, \
+ 41, 42, 43, 44, 45, 46, 47, 48, \
+ 49, 50, 51, 52, 53, 54, 55, 56, \
+ 57, 58, 59, 60, 61, 62, 63, 64
+
+//#define MYMATRIX 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,0,0,0,0, \
+ 0,0,0,0,1,2,3,4
+
+
+#define MYMATRIX 1, 1, 1, 1, 1, 1, 1, 1, \
+ 1, 1, 1, 1, 1, 1, 1, 1, \
+ 1, 1, 1, 1, 1, 1, 1, 1, \
+ 1, 1, 1, 1, 1, 1, 1, 1, \
+ 1, 1, 1, 1, 1, 1, 1, 1, \
+ 1, 1, 1, 1, 1, 1, 1, 1, \
+ 1, 1, 1, 1, 1, 1, 1, 1, \
+ 1, 1, 1, 1, 1, 1, 1, 1
+
+//#define MYMATRIX2 1.23, 1.23, 1.23, 1.23, 1.23, 1.23, 1.23,
1.23, \
+ 1.23, 1.23, 1.23, 1.23, 1.23, 1.23, 1.23,
1.23, \
+ 1.23, 1.23, 1.23, 1.23, 1.23, 1.23, 1.23,
1.23, \
+ 1.23, 1.23, 1.23, 1.23, 1.23, 1.23, 1.23,
1.23, \
+ 1.23, 1.23, 1.23, 1.23, 1.23, 1.23, 1.23,
1.23, \
+ 1.23, 1.23, 1.23, 1.23, 1.23, 1.23, 1.23,
1.23, \
+ 1.23, 1.23, 1.23, 1.23, 1.23, 1.23, 1.23,
1.23, \
+ 1.23, 1.23, 1.23, 1.23, 1.23, 1.23, 1.23,
1.23
+
+#define MYMATRIX10 MYMATRIX, MYMATRIX, MYMATRIX, MYMATRIX, MYMATRIX, \
+ MYMATRIX, MYMATRIX, MYMATRIX, MYMATRIX,
MYMATRIX
+
+#define MYMATRIX100 MYMATRIX10, MYMATRIX10, MYMATRIX10, MYMATRIX10,
MYMATRIX10, \
+ MYMATRIX10, MYMATRIX10, MYMATRIX10,
MYMATRIX10, MYMATRIX10
+
+#define MYMATRIX2 -2, -2, -2, -2, -2, -2, -2, -2, \
+ -2, -2, -2, -2, -2, -2, -2, -2, \
+ -2, -2, -2, -2, -2, -2, -2, -2, \
+ -2, -2, -2, -2, -2, -2, -2, -2, \
+ -2, -2, -2, -2, -2, -2, -2, -2, \
+ -2, -2, -2, -2, -2, -2, -2, -2, \
+ -2, -2, -2, -2, -2, -2, -2, -2, \
+ -2, -2, -2, -2, -2, -2, -2, -2
+
+
+#define MYMATRIX210 MYMATRIX2, MYMATRIX2, MYMATRIX2, MYMATRIX2, MYMATRIX2, \
+ MYMATRIX2, MYMATRIX2, MYMATRIX2, MYMATRIX2, MYMATRIX2
+
+#define MYMATRIX2100 MYMATRIX210, MYMATRIX210, MYMATRIX210, MYMATRIX210,
MYMATRIX210, \
+ MYMATRIX210, MYMATRIX210, MYMATRIX210,
MYMATRIX210, MYMATRIX210
+
+float dumb = 9;
+float in1[SIZE] = { MYMATRIX10 };
+float dumb2 = 9;
+
+float dumb3 = 9;
+float in2[SIZE] __attribute__((aligned(16))) = { MYMATRIX210
+ };
+
+float dumb4 = 9;
+
+float out[SIZE] __attribute__((aligned(16)));
+
+spe_fir_fff_params_t spe_fir_fff_params[NUM_SPE] __attribute__((aligned(16)));
+
+typedef struct {
+ spe_context_ptr_t spe;
+ spe_fir_fff_params_t *spe_fir_fff_params;
+} thread_arg_t;
+
+void *run_abs_spe(void *thread_arg)
+{
+ int ret;
+ thread_arg_t *arg = (thread_arg_t *) thread_arg;
+ unsigned int entry;
+ spe_stop_info_t stop_info;
+
+ entry = SPE_DEFAULT_ENTRY;
+ ret = spe_context_run(arg->spe, &entry, 0, arg->spe_fir_fff_params, NULL,
&stop_info);
+ if (ret < 0) {
+ perror("spe_context_run");
+ return NULL;
+ }
+
+ return NULL;
+}
+
+int main(int argc, char **argv)
+{
+ int i;
+ int ret;
+
+ spe_program_handle_t *prog;
+ spe_context_ptr_t spe[NUM_SPE];
+ pthread_t thread[NUM_SPE];
+ thread_arg_t arg[NUM_SPE];
+
+ printf("size: spe_fir_fff_params_t: %02d\n", sizeof(spe_fir_fff_params_t));
+
+ prog = spe_image_open("fir_fff_spe.elf");
+ if (!prog) {
+ perror("spe_image_open");
+ exit(1);
+ }
+
+ for (i = 0; i < NUM_SPE; ++i) {
+ spe_fir_fff_params[i].ntaps = 4;
+ spe[i] = spe_context_create(0, NULL);
+ if (!spe[i]) {
+ perror("spe_context_create");
+ exit(1);
+ }
+
+ ret = spe_program_load(spe[i], prog);
+ if (ret) {
+ perror("spe_program_load");
+ exit(1);
+ }
+ }
+
+ unsigned int j;
+ int size = SIZE/NUM_SPE;
+
+ for (j = 0; j < 1; ++j) {
+
+
+ for (i = 0; i < NUM_SPE; ++i) {
+ spe_fir_fff_params[i].ea_in1 = (unsigned long) &in1[i*size ];
+ spe_fir_fff_params[i].ea_in2 = (unsigned long) &in2[i*size ];
+ spe_fir_fff_params[i].ea_out = (unsigned long) &out[i*size];
+ spe_fir_fff_params[i].size = size;
+
+ arg[i].spe = spe[i];
+ arg[i].spe_fir_fff_params = &spe_fir_fff_params[i];
+
+ ret = pthread_create(&thread[i], NULL, run_abs_spe, &arg[i]);
+ if (ret) {
+ perror("pthread_create");
+ exit(1);
+ }
+ }
+ pthread_join(thread[i], NULL);
+ }
+
+
+ for (i = 0; i < NUM_SPE; ++i) {
+ //pthread_join(thread[i], NULL);
+ ret = spe_context_destroy(spe[i]);
+ if (ret) {
+ perror("spe_context_destroy");
+ exit(1);
+ }
+ }
+
+ ret = spe_image_close(prog);
+ if (ret) {
+ perror("spe_image_close");
+ exit(1);
+ }
+
+ for (i = 0; i < 4; ++i) {
+ printf("out[%02d]=%f\n", i, out[i]);
+ }
+ printf("size %0d result=%f\n", size, out[0]);
+
+ return 0;
+}
Property changes on:
gnuradio/branches/developers/ngoergen/spe_fir_fff/multi_fir_fff_ppe.c
___________________________________________________________________
Name: svn:executable
+ *
Added: gnuradio/branches/developers/ngoergen/spe_fir_fff/spe_fir_fff_params.h
===================================================================
--- gnuradio/branches/developers/ngoergen/spe_fir_fff/spe_fir_fff_params.h
(rev 0)
+++ gnuradio/branches/developers/ngoergen/spe_fir_fff/spe_fir_fff_params.h
2008-02-13 15:32:13 UTC (rev 7651)
@@ -0,0 +1,14 @@
+#ifndef SPE_FIR_FFF_PARAMS_H_
+#define SPE_FIR_FFF_PARAMS_H_
+
+typedef struct {
+ unsigned long long ea_in1;
+ unsigned long long ea_in2;
+ unsigned long long ea_out;
+ unsigned int size;
+ unsigned int ntaps;
+ unsigned int offset;
+ int pad[7];
+} spe_fir_fff_params_t;
+
+#endif /*SPE_FIR_FFF_PARAMS_H_*/
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r7651 - in gnuradio/branches/developers/ngoergen: . spe_fir_fff,
ngoergen <=