commit-gnuradio
[Top][All Lists]
Advanced

[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_*/





reply via email to

[Prev in Thread] Current Thread [Next in Thread]