void generateUseDef(vertex_t* vertex_list, int nvertex, int nsym, int nactive, Random* r, bool print_input){ //printf("in generateUseDef\n"); int j; int sym; for(int i = 0; i < nvertex; ++i){ if(print_input){ printf("[%d] usedef = {", vertex_list[i].index); } for (j = 0; j < nactive; ++j) { sym = abs(nextRand(r)) % nsym; if (j % 4 != 0) { if(!bitset_get_bit(vertex_list[i].def, sym)){//!bitset_get_bit(v->def, sym)){ if(print_input){ printf(" u %d", sym); } bitset_set_bit(vertex_list[i].use, sym);//bitset_set_bit(v->use, sym, true); } }else{ if(!bitset_get_bit(vertex_list[i].use, sym)){//!bitset_get_bit(v->use, sym)){ if(print_input){ printf(" d %d", sym); } bitset_set_bit(vertex_list[i].def, sym);//bitset_set_bit(v->def, sym, true); } } } if(print_input){ printf("}\n"); } } }
int32_t bitset_gol_get_bit_neighbours(register const t_bitset *const bitset, register const size_t const *x, register const size_t const *y) { register int32_t n = 0; n += bitset_get_bit(bitset, (*x + 7) & 7, (*y + 7) & 7); n += bitset_get_bit(bitset, *x, (*y + 7) & 7); n += bitset_get_bit(bitset, (*x + 1) & 7, (*y + 7) & 7); n += bitset_get_bit(bitset, (*x + 7) & 7, *y); n += bitset_get_bit(bitset, (*x + 1) & 7, *y); n += bitset_get_bit(bitset, (*x + 7) & 7, (*y + 1) & 7); n += bitset_get_bit(bitset, *x, (*y + 1) & 7); n += bitset_get_bit(bitset, (*x + 1) & 7, (*y + 1) & 7); return (n); }
static int huffman_tree_deserialize_recurse(huffman_node* curr_node, bitset* tree_binary_rep, int *bits_read) { if((*bits_read) >= tree_binary_rep->total_bits) { return HUFFMAN_SUCCESS; } int node_creation_status, deserialization_status; unsigned int curr_bit; bitset_get_bit(tree_binary_rep, *bits_read, &curr_bit); (*bits_read)++; if(curr_bit == 0) { huffman_node* new_node; node_creation_status = huffman_node_create(&new_node); if(node_creation_status != HUFFMAN_SUCCESS) { return node_creation_status; } deserialization_status = huffman_tree_deserialize_recurse(new_node, tree_binary_rep, bits_read); if(deserialization_status != HUFFMAN_SUCCESS) { huffman_node_destroy(new_node); return deserialization_status; } curr_node->left = new_node; node_creation_status = huffman_node_create(&new_node); if(node_creation_status != HUFFMAN_SUCCESS) { return node_creation_status; } deserialization_status = huffman_tree_deserialize_recurse(new_node, tree_binary_rep, bits_read); if(deserialization_status != HUFFMAN_SUCCESS) { huffman_node_destroy(new_node); return deserialization_status; } curr_node->right = new_node; curr_node->is_leaf = 0; } else { unsigned char byte = 0; for(int i = 0; i < 8; i++) { unsigned int bit; int bit_read_status = bitset_get_bit(tree_binary_rep, *bits_read, &bit); if(bit_read_status == BITSET_OUT_OF_BOUNDS) { return HUFFMAN_ENCODING_ERROR; } (*bits_read)++; if(bit == 1) { unsigned char mask = 1 << (8 - i - 1); byte |= mask; } } curr_node->which_char = byte; } return HUFFMAN_SUCCESS; }
void work(param_t param) { printf("SPU[%u] work()\n", param.proc); unsigned int inbox, offset; unsigned int *in = malloc_align(param.bitset_size, ALIGN_EXP); unsigned int *out = malloc_align(param.bitset_size, ALIGN_EXP); unsigned int *use = malloc_align(param.bitset_size, ALIGN_EXP); unsigned int *def = malloc_align(param.bitset_size, ALIGN_EXP); if(in == NULL || out == NULL || use == NULL || def == NULL) { printf("malloc_align() failed\n"); exit(1); } unsigned tag_1, tag_2, tag_3, tag_4; unsigned int tag_id; /* Reserve a tag for application usage */ if ((tag_1 = mfc_tag_reserve()) == MFC_TAG_INVALID) { printf("ERROR: unable to reserve a tag_1\n"); } if ((tag_2 = mfc_tag_reserve()) == MFC_TAG_INVALID) { printf("ERROR: unable to reserve a tag_2\n"); } if ((tag_3 = mfc_tag_reserve()) == MFC_TAG_INVALID) { printf("ERROR: unable to reserve a tag_3\n"); } if ((tag_4 = mfc_tag_reserve()) == MFC_TAG_INVALID) { printf("ERROR: unable to reserve a tag_4\n"); } while(1) { inbox = spu_read_in_mbox(); if(inbox == UINT_MAX) { printf("SPU[%u] received exit signal.. exiting.\n", param.proc); return; } offset = param.bitset_subsets*inbox; mfc_get(in, (unsigned int) (param.bs_in_addr + offset), param.bitset_size, tag_1, 0, 0); mfc_get(out, (unsigned int) (param.bs_out_addr + offset), param.bitset_size, tag_2, 0, 0); mfc_get(use, (unsigned int) (param.bs_use_addr + offset), param.bitset_size, tag_3, 0, 0); mfc_get(def, (unsigned int) (param.bs_def_addr + offset), param.bitset_size, tag_4, 0, 0); mfc_write_tag_mask(1 << tag_1 | 1 << tag_2 | 1 << tag_3 | 1 << tag_4); mfc_read_tag_status_all(); D(printf("SPU[%d] index: %u bitset_subsets: %u offset: %u\n", param.proc, inbox, param.bitset_subsets, offset); printf("SPU[%d]\t&use: %p\n\t&def: %p\n\t&out: %p\n\t&in: %p\n", param.proc, (void*)param.bs_use_addr, (void*)param.bs_def_addr, (void*)param.bs_out_addr, (void*)param.bs_in_addr); void *tmp_ptr = (void*) (param.bs_use_addr + offset); printf("SPU[%d] read\t\t&%p = use(%p)={", param.proc, (void*)use, tmp_ptr); for (int i = 0; i < 100; ++i){ if ( bitset_get_bit(use, i) ) { printf("%d ", i); } } printf("}\n"); tmp_ptr = (void*) (param.bs_def_addr + offset); printf("SPU[%d] read\t\t&%p = def(%p)={", param.proc, (void*)def, tmp_ptr); for (int i = 0; i < 100; ++i){ if ( bitset_get_bit(def, i) ) { printf("%d ", i); } } printf("}\n"); tmp_ptr = (void*) (param.bs_out_addr + offset); printf("SPU[%d] read\t\t&%p = out(%p)={", param.proc, (void*)out, tmp_ptr); for (int i = 0; i < 100; ++i){ if ( bitset_get_bit(out, i) ) { printf("%d ", i); } } printf("}\n"); tmp_ptr = (void*) (param.bs_in_addr + offset); printf("SPU[%d] read\t\t&%p = in (%p)={", param.proc, (void*)in, tmp_ptr); for (int i = 0; i < 100; ++i){ if ( bitset_get_bit(in, i) ) { printf("%d ", i); } } printf("}\n")); bitset_megaop(param, in, out, use, def); D(printf("SPU[%d] calculated\tin={", param.proc); for (int i = 0; i < 100; ++i){ if ( bitset_get_bit(in, i) ) { printf("%d ", i); } } printf("}\n");) mfc_put(in, (unsigned int) (param.bs_in_addr + offset), param.bitset_size, tag_1, 0, 0); mfc_write_tag_mask(1 << tag_1); mfc_read_tag_status_all(); spu_write_out_intr_mbox(inbox); }