To produce a simple program for the CBE, you should follow the steps listed below (this example is included in the SDK in /opt/cell/sdk/src/tutorial/simple).
######################################################################## # Subdirectories ######################################################################## DIRS := spu ######################################################################## # Target ######################################################################## PROGRAM_ppu := simple ######################################################################## # Local Defines ######################################################################## IMPORTS := spu/lib_simple_spu.a -lspe2 -lpthread # imports the embedded simple_spu library # allows consolidation of spu program into ppe binary ######################################################################## # make.footer ######################################################################## # make.footer is in the top of the SDK ifdef CELL_TOP include $(CELL_TOP)/buildutils/make.footer else include ../../../../buildutils/make.footer endif
#include <stdlib.h> #include <stdio.h> #include <errno.h> #include <libspe2.h> #include <pthread.h> extern spe_program_handle_t simple_spu; #define MAX_SPU_THREADS 16 void *ppu_pthread_function(void *arg) { spe_context_ptr_t ctx; unsigned int entry = SPE_DEFAULT_ENTRY; ctx = *((spe_context_ptr_t *)arg); if (spe_context_run(ctx,&entry, 0, NULL, NULL, NULL) < 0) { perror ("Failed running context"); exit (1); } pthread_exit(NULL); } int main() { int i,spu_threads; spe_context_ptr_t ctxs[MAX_SPU_THREADS]; pthread_t threads[MAX_SPU_THREADS]; /* Determine the number of SPE threads to create */ spu_threads = spe_cpu_info_get(SPE_COUNT_USABLE_SPES, -1); if (spu_threads > MAX_SPU_THREADS) spu_threads = MAX_SPU_THREADS; /* Create several SPE-threads to execute 'simple_spu' */ for(i=0; i<spu_threads; i++) { /* Create context */ if ((ctxs[i] = spe_context_create (0, NULL)) == NULL) { perror ("Failed creating context"); exit (1); } /* Load program into context */ if (spe_program_load (ctxs[i],&simple_spu)) { perror ("Failed loading program"); exit (1); } /* Create thread for each SPE context */ if (pthread_create (&threads[i], NULL,&ppu_pthread_function,&ctxs[i])) { perror ("Failed creating thread"); exit (1); } /* Wait for SPU-thread to complete execution. */ for (i=0; i<spu_threads; i++) { if (pthread_join (threads[i], NULL)) { perror("Failed pthread_join"); exit (1); } } printf("\nThe program has successfully executed.\n"); return (0); }
####################################################################### # Target ######################################################################## PROGRAMS_spu := simple_spu # created embedded library LIBRARY_embed := lib_simple_spu.a ######################################################################## # make.footer ######################################################################## # make.footer is in the top of the SDK ifdef CELL_TOP include $(CELL_TOP)/buildutils/make.footer else include ../../../../../buildutils/make.footer endif
#include <stdio.h> int main(unsigned long long id) { /* The first parameter of an spu program will always be the spe_id of the spe * thread that issued it. */ printf("Hello Cell (0x%llx)\n", id); return 0; }
make
This CBE program then creates SPE threads that output "Hello Cell (#)\n" to the systemsim output window, where # is the spe_id of the SPE thread that issued the print.