Center for Manycore Programming

A Simple Parallel Loop in COMIC

Following code is a simple OpenMP program. In this example, we will convert the OpenMP code to Cell BE code using COMIC library.

#include <stdio.h>
#include <omp.h>
#define SIZE 24

int a[ SIZE ];

int main() {
    int i;

#pragma omp parallel for
    for( i=0; i < SIZE; i++ )
        a[i] = i;

    for( i=0; i < SIZE; i++ )
        printf( "%d\n", a[ i ] );

    return 0;
}

1. Common code

We need the declaration of shared variables.

/* example_common.h */

#define SIZE 24

COMIC_shared (
     int a[ SIZE ];
);

2. SPE code

/* example_spe.c */

#include <comic_spe.h>
#include "example_common.h"

COMIC_shared_extern();
COMIC_shared_region();

void spe_main_case0() {
    int i, tid, chunk, low, high;

    tid = COMIC_get_spe_thread_id();
    chunk = SIZE / COMIC_MAX_NUM_SPE_THREADS;
    low = tid * chunk;
    high = (tid == ( COMIC_MAX_NUM_SPE_THREADS-1)) ? SIZE : (low + chunk);

    for( i = low; i < high; i++ )
        COMIC_spe_write_int( &COMIC_access(a[i]), i );

    /* implicit barrier */
    COMIC_spe_barrier( 0 );
}

COMIC_spe_main (
    case 0:
        spe_main_case0();
        break;
)

The SPE code is compiled with spuxlc.

$ spuxlc -O3 -I../comic-0.8.0 -c ../comic-0.8.0/comic_spe.c
$ spuxlc -I../comic-0.8.0 -c ../comic-0.8.0/comic_spe_toe.s
$ spuxlc -O5 -I../comic-0.8.0 -c example_spe.c
$ spuxlc -O5 -o example_spe comic_spe.o comic_spe_toe.o example_spe.o
$ ppu32-embedspu COMIC_spe_handle example_spe example_spe_csf.o

3. PPE code

/* example_ppe.c */
#include <stdio.h>
#include <comic_ppe.h>
#include "example_common.h"

COMIC_shared_region();

int main() {
    int i;

    /* initialization of COMIC library */
    COMIC_ppe_init();

    /* parallel execution */
    COMIC_ppe_run( 0 );

    for( i=0; i < SIZE; i++ )
        printf( "%d\n", COMIC_access( a[ i ] ) );

    /* termination of SPE threads */
    COMIC_ppe_exit();

    return 0;
}

PPE code is compiled with ppuxlc.

$ ppuxlc -O5 -I../comic-0.8.0 -I/opt/cell/sdk/src/include/ppu -c ../comic-0.8.0/comic_ppe.c
$ ppuxlc -O5 -I../comic-0.8.0 -c example_ppe.c
$ ppuxlc -O5 -o example_comic -lspe2 -lpthread comic_ppe.o example_ppe.o example_spe_csf.o

Run the executable. Then, you will see the same result with the OpenMP's.

$ ./example_comic

You can download above examples: example.tar.gz