Ejemplo n.º 1
0
 void parallelOperation(double **a, double **b, double **c, int size, int operation)
 {
	int i;
	struct work_struct *jobs[CPUCORES];

	aa = a;
	bb = b;
	cc = c;

	matrixSize = size;

	for (i = 0; i < CPUCORES; i++) {
		jobs[i] = malloc(sizeof(struct work_struct));
		if (jobs[i] == NULL) {
			perror(NULL);
			exit(1);
		}
		jobs[i]->id = i;
	}
	
	job_init();
	
	switch(operation){
		case MULTIPLY:{
	//		printf("Multiply[%d]: ", size);
			for (i = 1; i < CPUCORES; i++)
				job_create(mm, jobs[i], 0);
			mm(jobs[0]);
		}break;

		case VECTOR:{
	//		printf("Vector[%d]: ", size);
			for (i = 1; i < CPUCORES; i++)
				job_create(mv, jobs[i], 0);
			mv(jobs[0]);
		}break;

		case ADD:{
	//		printf("Add[%d]: ", size);
			for (i = 1; i < CPUCORES; i++)
				job_create(add, jobs[i], 0);
			add(jobs[0]);
		}break;

		case SCALE:{
	//		printf("Scale[%d]: ", size);
			for (i = 1; i < CPUCORES; i++)
				job_create(scale, jobs[i], 0);
			scale(jobs[0]);
		}break;
	}
		

	for (i = 1; i < CPUCORES; i++)
		job_join(jobs[i]);

//	printf("\n");
}
Ejemplo n.º 2
0
ushort lcs(const struct sequence *s1, const struct sequence *s2)
{
	ushort alen = s1->len;
	ushort blen = s2->len;

	job_init();

	struct work_struct a_work = {
		.id   = 0,
		.a    = s1->str,
		.alen = alen,
		.b    = s2->str,
		.blen = blen,
		.ret  = NULL
	};

	struct work_struct b_work = {
		.id   = 1,
		.a    = s1->str,
		.alen = alen,
		.b    = s2->str,
		.blen = blen,
		.ret  = NULL
	};

	job_create(memo_lcs_front, &a_work, 0);
	memo_lcs_back(&b_work);
	job_join(&a_work);

	ushort *forward	= a_work.ret;
	ushort *backward = b_work.ret;

	ushort i = 0;
	ushort ibest = 0;
	for (i = 1; i < blen + 1; i++) {
		if (forward[i] + backward[i - 1] > ibest)
			ibest = forward[i] + backward[i - 1];
	}
	return ibest;
}
Ejemplo n.º 3
0
void strassen_8thread_mult(matrix a, matrix b, matrix c){
	matrix quar[12];
	matrix m[7];
	struct work_struct *jobs[7];
	int size = a.size/2;
	int i, j;
	
	if(size==0){
		c.rows[0][0] = a.rows[0][0] * b.rows[0][0];
		return;
	}

	/*
	if (a.size <= BREAK) {
		int i, j, k;
		for (i = 0; i < (a.size); i++) {
			for (k = 0; k < (a.size); k++) {
				for (j = 0; j < (a.size); j++) {
					c.rows[i][j] += a.rows[i][k] * b.rows[k][j];
				}
			}
		}
        return;
    }
	*/
	
	job_init();
	
	quar[0]=get00(a);  quar[1]=get01(a);
	quar[2]=get10(a);  quar[3]=get11(a);

	quar[4]=get00(b);  quar[5]=get01(b);
	quar[6]=get10(b);  quar[7]=get11(b);

	quar[8]=get00(c);  quar[9]=get01(c);
	quar[10]=get10(c); quar[11]=get11(c);

	for(i=0;i<7;i++){
		m[i] = new_matrix(size);
	}

	for (i = 0; i < 7; i++) {
		jobs[i] = malloc(sizeof(struct work_struct));
		if (jobs[i] == NULL) {
			perror(NULL);
			exit(1);
		}
	}
	
	jobs[0]->a_1 = quar[0];
	jobs[0]->a_2 = quar[3];
	jobs[0]->b_1 = quar[4];
	jobs[0]->b_2 = quar[7];
	jobs[0]->c = m[0];
	jobs[0]->tid = 0;
	job_create(thread_main, jobs[0], 0);


	jobs[1]->a_1 = quar[2];
	jobs[1]->a_2 = quar[3];
	jobs[1]->b_1 = quar[4];
	jobs[1]->c = m[1];
	jobs[1]->tid = 1;
	job_create(thread_main, jobs[1], 0);


	jobs[2]->a_1 = quar[0];
	jobs[2]->b_1 = quar[5];
	jobs[2]->b_2 = quar[7];
	jobs[2]->c = m[2];
	jobs[2]->tid = 2;
	job_create(thread_main, jobs[2], 0);


	jobs[3]->a_1 = quar[3];
	jobs[3]->b_1 = quar[6];
	jobs[3]->b_2 = quar[4];
	jobs[3]->c = m[3];
	jobs[3]->tid = 3;
	job_create(thread_main, jobs[3], 0);


	jobs[4]->a_1 = quar[0];
	jobs[4]->a_2 = quar[1];
	jobs[4]->b_1 = quar[7];
	jobs[4]->c = m[4];
	jobs[4]->tid = 4;
	job_create(thread_main, jobs[4], 0);


	jobs[5]->a_1 = quar[2];
	jobs[5]->a_2 = quar[0];
	jobs[5]->b_1 = quar[4];
	jobs[5]->b_2 = quar[5];
	jobs[5]->c = m[5];
	jobs[5]->tid = 5;
	job_create(thread_main, jobs[5], 0);


	jobs[6]->a_1 = quar[1];
	jobs[6]->a_2 = quar[3];
	jobs[6]->b_1 = quar[6];
	jobs[6]->b_2 = quar[7];
	jobs[6]->c = m[6];
	jobs[6]->tid = 6;
	job_create(thread_main, jobs[6], 0);


	for(i=0;i<7;i++){
		job_join(jobs[i]);
	}

	for(i=0;i<size;i++){
		for(j=0;j<size;j++){
			quar[8].rows[i][j] = m[0].rows[i][j] + m[3].rows[i][j] - m[4].rows[i][j] + m[6].rows[i][j];
			quar[9].rows[i][j] = m[2].rows[i][j] + m[4].rows[i][j];
			quar[10].rows[i][j] = m[1].rows[i][j] + m[3].rows[i][j];
			quar[11].rows[i][j] = m[0].rows[i][j] - m[1].rows[i][j] + m[2].rows[i][j] + m[5].rows[i][j];
		}
	}

	for(i=0;i<12;i++){
		delete_matrix(quar[i]);
	}
	for(i=0;i<7;i++){
		delete_matrix(m[i]);
	}
}