==================
  塼ȥꥢ
==================

Ȥ 2 ĤΥ٥ȥ xi, xj ¤ѻѥץ饤ϩ 
GRAPE-7 Model100 ˼뤳Ȥͤޤ

ʤʲѤ PGPG2  C Υץ륽 Makefile 
PGPG2 եȥѥå pg2pkg/sample/vsum/ ˤޤ


------------
 ϩε
------------

褦ȤƤѥץ饤ϩư򵼻Ū C ǵҤ
ȡʲΤ褦˽񤱤ޤ

    float x[4][3];
    float y[4096][3];
    int   z[4][3];

    for (i = 0; i < 4; i++) {
        for (k = 0; k < 3; k++) {
            z[k] = 0;
        }
        for (j = 0; j = n; j++) {
            for (k = 0; k < 3; k++) {
                z[i][k] += (x[i][k] + y[j][k]);
            }
        }
    }

α黻 PGPG2 ǤϰʲΤ褦˵Ҥޤ

    float18.9   x[3]   ipin;
    float18.9   y[3]   jpin;
    int32       z[3]   fout;

    z += (int32)(x + y);

    parameter ARCH     "GRAPE7M100";
    parameter NPIPE    4;
    parameter JMEMSIZE 4096;
    parameter PREFIX   "vsum";


εҤ顢黻ѥץ饤 4 ܤȡ y  4096 Ĥ֤Ǽ
Υ꤬ޤ

ƥѥץ饤Υ쥸ˡߤ˰ۤʤ x 򥻥åȤƷ׻򳫻Ϥ
ȡ꤫襯å 1 Ĥ y  4 ܤΥѥץ饤
줾Υѥץ饤 x  y βûԤ̤ƥѥץ饤
 z 쥸ѻޤ

x  y ͤ䡢ѻ z ͤɤ߽Фϡۥȷ׻Ԥ
ޤϥ桼饤֥𤷤ƹԤޤ桼饤֥
嵭 PGPG2 Ҥޤ

------------
 ϩ
------------

ѥץ饤ϩԤޥɤμ¹ʲ˼ޤ
 PGPG2 ˤ뵭Ҥ /home/kawai/vsum/vsum.pg2 Ȥե˽
ƤΤȤޤ PGPG2 եȥѥåŬڤ˥󥹥ȡ
뤵졢ĶѿŬڤˤʤƤΤȤޤ

    localhost> setenv PGPG2PATH /home/kawai/pg2pkg
    localhost> setenv PATH $PGPG2PATH/bin:$PATH
    localhost> cd /home/kawai/vsum/
    localhost> mkdir vhdl
    localhost> cd vhdl
    localhost> pg2pgdl ../vsum.pg2 | pgdl2vhdl
    localhost> ls
    arch:g7m1    backend:pg_proc.vhd
    hib.vhd         hibscfifo.vhd  ifpga.vhd      pcicore.vhd    pg_dpram.vhd   pg_pipe.vhd
    hibdcram.vhd    ifpga.qpf      ifpgapll.vhd   pg_ctl.vhd     pg_ifbuf.vhd   pg_proc.vhd
    hibdcrambe.vhd  ifpga.qsf      ifpgapll1.vhd  pg_dcfifo.vhd  pg_module.vhd  pg_scfifo.vhd

ĥ .vhd ĥե˲ϩǡǼƤޤʳΥե
ˤ QuartusII ΥץȴǡǼƤޤ
ѥץ饤γƼ黻 pg_module.vhd Ƥޤ
黻֤³ pg_pipe.vhd ˵ҤƤޤ

QuartusII ưץȥե ifpga.qpf 򳫤Ʋϩ
ԤСϩǡ ifpga.sof ޤβϩ GRAPE-7  
FPGA ˽񤭹ȡѥץ饤ºݤ˻ѤǤ褦ˤʤޤ
ϩǡ FPGA ؽ񤭹ˡˤĤƤ PGPG2 桼 
pg2pkg/doc/usersguide-j.txt 򻲾ȤƤ

-------------------------
 桼饤֥
-------------------------

ϩ򥢥ץꥱץ (C 뤤 C++ ǵҤ줿ʪ) 
Ѥ뤿Υإåե vsumutil.h ȥ饤֥ libvsum.a 
륳ޥɤμ¹ʲ˼ޤ

    localhost> cd /home/kawai/vsum/
    localhost> mkdir lib
    localhost> cd lib
    localhost> pg2pgdl ../vsum.pg2 | pgdl2lib
    localhost> ls
    Makefile  vsumutil.c  vsumutil.h
    localhost> make
    gcc  -g -O0 -o vsumutil.o -I. -I/home/kawai/pg2pkg/include -c vsumutil.c
    vsumutil.c:73: ٹ: Ǥ¿ޤ
    vsumutil.c:73: ٹ: (near initialization for 'vsum_npipes')
    ar ruv libvsum.a vsumutil.o
    ar: libvsum.a ޤ
    a - vsumutil.o
    ranlib libvsum.a
    localhost> ls
    Makefile  libvsum.a  vsumutil.c  vsumutil.h  vsumutil.o

--------------------------------
 ӥåȥ٥륨ߥ졼
--------------------------------

ºݤβϩȴƱα黻̤֤եȥߥ졼
Υإåե vsumutil.h ȥ饤֥ libvsumemu.a 
륳ޥɤμ¹ʲ˼ޤ

    localhost> cd /home/kawai/vsum/
    localhost> mkdir emu
    localhost> cd emu
    localhost> pg2pgdl ../vsum.pg2 | pgdl2emu
    localhost> ls
    Makefile  vsumemu.c  vsumutil.h
    localhost> make
    gcc  -g -O0 -o vsumemu.o -I. -I/home/kawai/pg2pkg/include -c vsumemu.c
    ar ruv libvsumemu.a vsumemu.o
    ar: libvsumemu.a ޤ
    a - vsumemu.o
    ranlib libvsumemu.a
    gcc -L. -L/home/kawai/pg2pkg/lib -g -O0 -o vsumpipe -I. -I/home/kawai/pg2pkg/include -DMAINFUNC vsumemu.c -lpgemu -lm
    localhost> ls
    Makefile  libvsumemu.a  vsumemu.c  vsumemu.o  vsumpipe  vsumutil.h


---------------------------------------
 ץꥱץफλ
---------------------------------------

ϩޤϤΥߥ졼Ѥƿͷ׻Ԥץꥱץ
Υ (C ǵ) ʲ˼ޤ

#include <stdio.h>
#include "vsumutil.h"

void
run_pipeline(int nj, int ni, double (*x)[3], double (*y)[3], double (*z)[3])
{
    int off, npipe;
    vsum_set_jp(0, nj, y);
    vsum_set_n(nj);
    npipe = vsum_get_number_of_pipelines();
    for (off = 0; off < ni; off += npipe) {
        if (off + npipe > ni) {
            npipe = ni - off;
        }
        vsum_set_ip(npipe, x + off);
        vsum_run();
        vsum_get_fout(npipe, z + off);
    }
}

int
main(int argc, char **argv)
{
    static double x[256][3];
    static double y[256][3];
    static double z[256][3];
    int i, j, nj = 3, ni = 2;

    // 'x's are set to pipeline register.
    x[0][0] = 0.0; x[0][1] = 0.0; x[0][2] = 0.0;
    x[1][0] = 1.0; x[1][1] = 2.0; x[1][2] = -3.0;

    // 'y's are set to j-memory.
    y[0][0] = 1.0; y[0][1] = 1.0; y[0][2] = -1.0;
    y[1][0] = 1.0; y[1][1] = 2.0; y[1][2] = -2.0;
    y[2][0] = 1.0; y[2][1] = 3.0; y[2][2] = -3.0;

    vsum_open();
    vsum_set_scale_x(1.0);
    vsum_set_scale_y(1.0);
    vsum_set_scale_z(1.0);
    run_pipeline(nj, ni, x, y, z);
    vsum_close();

    for (j = 0; j < nj; j++) {
        printf("y[%d]: %e %e %e\n", j, y[j][0], y[j][1], y[j][2]);
    }
    printf("\n");
    for (i = 0; i < ni; i++) {
        printf("x[%d]: %e %e %e\n", i, x[i][0], x[i][1], x[i][2]);
        printf("z[%d]: %e %e %e\n", i, z[i][0], z[i][1], z[i][2]);
        printf("\n");
    }
}

Υ (/home/kawai/vsum/myapp/myapp.c ˵ҤƤ
ΤȤޤ) 򥳥ѥ뤷桼饤֥ȥ󥯤ȡϩ
ƿͷ׻Ԥμ¹ԷޤƱɤ򥨥ߥ
졼Υ饤֥˥󥯤ȡߥ졼Ѥƿͷ׻Ԥ
μ¹ԷޤץνϤϼºݤβϩȴ˰
ޤ

    localhost> pwd
    localhost> cc -L../lib -L/home/kawai/src/pg2pkg/lib -I../lib -I/home/kawai/pg2pkg/include -o myapp     myapp.c -lvsum -lhib -lm
    localhost> cc -L../emu                              -I../emu -I/home/kawai/pg2pkg/include -o myapp_emu myapp.c -lvsumemu    -lm

    localhost> ./myapp
    use vsum_cards[0]
    GRAPE-7(PCI-X) model100  vsum_nchip:1 vsum_npipes:4 vsum_jmemsize:4096
    vsum[0] opened.
    y[0]: 1.000000e+00 1.000000e+00 -1.000000e+00
    y[1]: 1.000000e+00 2.000000e+00 -2.000000e+00
    y[2]: 1.000000e+00 3.000000e+00 -3.000000e+00

    x[0]: 0.000000e+00 0.000000e+00 0.000000e+00
    z[0]: 3.000000e+00 6.000000e+00 -6.000000e+00

    x[1]: 1.000000e+00 2.000000e+00 -3.000000e+00
    z[1]: 6.000000e+00 1.200000e+01 -1.500000e+01

    localhost> ./myapp_emu
    y[0]: 1.000000e+00 1.000000e+00 -1.000000e+00
    y[1]: 1.000000e+00 2.000000e+00 -2.000000e+00
    y[2]: 1.000000e+00 3.000000e+00 -3.000000e+00

    x[0]: 0.000000e+00 0.000000e+00 0.000000e+00
    z[0]: 3.000000e+00 6.000000e+00 -6.000000e+00

    x[1]: 1.000000e+00 2.000000e+00 -3.000000e+00
    z[1]: 6.000000e+00 1.200000e+01 -1.500000e+01


---------------------
 ʣʥץ
---------------------

ʣļŪʥץ뤬 PGPG2 եȥѥå 
pg2pkg/sample/g5/ pg2pkg/sample/g6/ ˤޤ


䤤碌ӥХݡȤϲؤꤤޤ:
K&F Computing Research Co. (support@kfcr.jp)
