int main2mod(unsigned long long spe_id, unsigned long long program_data_ea, unsigned long long env) { unsigned tagid = spe_id&31; uint32 i,j; // get program data mfc_get(&pd, program_data_ea, sizeof(spu_program_data), tagid, 0, 0); mfc_write_tag_mask(1<<tagid); mfc_read_tag_status_all(); // precompute partial working states based on ihv & partial msg block pre_compute(pd.ihv1, pd.ihv2, pd.m1, pd.m2); if (pd.collisiondata > 0) { j = pd.collisiondata*8; vec_uint32* bufferptr = &buffer[j]; // get the trail buffer for (i = 0; i < j; i += 128) mfc_get(&buffer[i], &pd.buffer[i], sizeof(vec_uint32)*128, tagid, 0, 0); mfc_write_tag_mask(1<<tagid); mfc_read_tag_status_all(); // process collision trails reduce_trailsmod(pd.ihv1, pd.ihv2mod, pd.m1, pd.m2, &pd.astart, &buffer[0], bufferptr); reduce_trails2mod(pd.ihv1, pd.ihv2mod, pd.m1, pd.m2, &pd.astart, &buffer[0], bufferptr); find_collmod(pd.ihv1, pd.ihv2mod, pd.m1, pd.m2, &pd.astart, &buffer[0], bufferptr); // store the trail buffer for (i = 0; i < j; i += 128) mfc_put(&buffer[i], &pd.buffer[i], sizeof(vec_uint32)*128, tagid, 0, 0); mfc_write_tag_mask(1<<tagid); mfc_read_tag_status_all(); } else { // fill the trail buffer in steps and do intermediate DMA transfers vec_uint32* bufferptr = &buffer[0]; for (i = 0; i < BUFFERSIZE; i += 256) { bufferptr = generate_trailsmod(pd.ihv1, pd.ihv2mod, pd.m1, pd.m2, &pd.astart, bufferptr, &buffer[i+256]); mfc_put(&buffer[i], &pd.buffer[i], sizeof(vec_uint32)*128, tagid, 0, 0); mfc_put(&buffer[i+128], &pd.buffer[i+128], sizeof(vec_uint32)*128, tagid, 0, 0); } } // transfer the current program data back mfc_put(&pd, program_data_ea, sizeof(spu_program_data), tagid, 0, 0); // wait for dma transfers to complete mfc_write_tag_mask(1<<tagid); mfc_read_tag_status_all(); return 0; }
void read_from_stdin() { int n, i, value; int pos = 0; while((n = read(0, buf + pos, BUFSIZE - pos)) > 0){ pos += n; } gettimeofday(&t[1], NULL); buf[pos] = '\n'; buf[pos + 1] = '\0'; char *space = index(buf, ' '); N = atoi(buf); D = atoi(space + 1); gettimeofday(&t[2], NULL); /// read item prices. char *src = index(space + 1, '\n') + 1; value = 0; i = 0; while(i < N){ if(*src != '\n'){ value = 10 * value + digit[(int)*src]; }else{ count_and_offset[value]++; value = 0; i++; } src ++; } gettimeofday(&t[3], NULL); /// read campaign prices. int *dst = cprices; i = 0; value = 0; while(i < D){ if(*src != '\n'){ value = 10 * value + digit[(int)*src]; }else{ *(dst++) = value; value = 0; i++; } src ++; } gettimeofday(&t[4], NULL); pre_compute(); }