a pthread problem


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers a pthread problem
# 1  
Old 12-11-2008
a pthread problem

Hello,

I run my pthread code on Linux with 4 processors. However, the speed up is only 2 times.

The code is about solving equation (G+s(i)C)z(i)=B*us(i), i=1,...,n. Here G,C are m*m matrix, B*us(i) is a m*1 vector and s(i) are n different numbers. I need to solve the equation n times to get z(1)...z(n). Here, I use multithread to solve the n equations.
eg. Now I have 4 thread and n=12. Thread(1) solves 4 equations (G+s(1,2,3,4)C)X(1,2,3,4)=B. Thread(2) solves (G+s(5,6,7,8)C)X(5,6,7,8)=B....

I use pthread_creat() and pthread_join(). However, for 4thread, it is not as 4 times faster as 1 thread, only 2 times instead. For 2 thread, it is about 1.5 times as 1 thread. What I have observed that, to solve one equation under 4 thread is much slower than solving one equation using 1 thread.

Can anybody tell me what is the reason? Thanks a lot.

Below is the code. Thanks,

typedef struct{
int thread_no;
int allthread;
mat *G,*C,*B;
mat *us, *Z;
vec *samples;
double *Control, *Info;
} parm;


void sampleLU(int thread_no, int allthread, mat *G, mat *C, mat *B, mat &us, mat &Z, vec &samples, double Control[], double Info[])
{
Real_Timer lu_symbolic_init, lu_symbolic_free, lu_numerical, lu_solve_time;
Real_Timer sCpG_run_time;
int np = samples.size();
int nDim = B->m;
int start, stop;

start = thread_no * (int)(np/allthread);
stop = start + (int)(np/allthread) - 1;
if( thread_no == allthread-1 ) stop = np-1;
for (int i = start; i<=stop; i++ ){
cs *A;
if(thread_no == 0) {
sCpG_run_time.start();
A = G+sample(i)*C;
sCpG_run_time.stop();
}
else{
A = G+sample(i)*C;
}

/* LU decomposition */
...
if(i == start){
if(thread_no == 0) {
lu_symbolic_init.start();
A = LU;
lu_symbolic_init.stop();
}
else {
A = LU
}
}

/* solve Az = b */
double* z = new double[nDim];
vec b(nDim);
b.zeros();
if(thread_no == 0) lu_solve_time.start();
LUz=b
vec zz(z, nDim);
delete [] z;
Z.set_col(i, zz);
...
}
if(thread_no == 0){
std::cout << "Thread" << thread_no << " sC+G \t:" << sCpG_run_time.get_time() << std::endl;
std::cout << "Thread" << thread_no << " symbolic initial time: \t"<<lu_symbolic_init.get_time()<<std::endl;
std::cout << "Thread" << thread_no << " LU decomposition time \t:" << lu_numerical.get_time() << std::endl;
std::cout << "Thread" << thread_no << " symbolic free time: \t"<<lu_symbolic_init.get_time()<<std::endl;
std::cout << "Thread" << thread_no << " LU solve time \t: " << lu_solve_time.get_time() <<std::endl;

}
}
void * psampleLU(void *arg)
{
parm *p = (parm *)arg;
sampleLU(p->thread_no, p->allthread, p->G, p->C, p->B, *(p->us), *(p->Z), *(p->samples), p->Control, p->Info);
return NULL;
}
# 2  
Old 12-11-2008
You have not shown us all your code. Please show all your code and provide information about your OS version, compiler version and how you compiled your executable.
# 3  
Old 12-11-2008
Linux quad core Intel Xeon (2.99GHz, 16G memory)
compiler gcc version 4.1.2 20071124 (Red Hat 4.1.2-42)

I only use -lpthread

Code:

typedef struct{
int thread_no;
int allthread;
mat *G,*C,*B;
mat *us, *Z;
vec *samples;
double *Control, *Info;
} parm;


void sampleLU(int thread_no, int allthread, mat *G, mat *C, mat *B, mat &us, mat &Z, vec &samples, double Control[], double Info[])
{
Real_Timer lu_symbolic_init, lu_symbolic_free, lu_numerical, lu_solve_time;
Real_Timer sCpG_run_time;
int np = samples.size();
int nDim = B->m;
int start, stop;

start = thread_no * (int)(np/allthread);
stop = start + (int)(np/allthread) - 1;
if( thread_no == allthread-1 ) stop = np-1;
for (int i = start; i<=stop; i++ ){
cs *A;
if(thread_no == 0) {
sCpG_run_time.start();
A = G+sample(i)*C;
sCpG_run_time.stop();
}
else{
A = G+sample(i)*C;
}

/* LU decomposition */
...
if(i == start){
if(thread_no == 0) {
lu_symbolic_init.start();
A = LU;
lu_symbolic_init.stop();
}
else {
A = LU
}
}

/* solve Az = b */
double* z = new double[nDim];
vec b(nDim);
b.zeros();
if(thread_no == 0) lu_solve_time.start();
LUz=b
vec zz(z, nDim);
delete [] z;
Z.set_col(i, zz);
...
}
if(thread_no == 0){
std::cout << "Thread" << thread_no << " sC+G \t:" << sCpG_run_time.get_time() << std::endl;
std::cout << "Thread" << thread_no << " symbolic initial time: \t"<<lu_symbolic_init.get_time()<<std::endl;
std::cout << "Thread" << thread_no << " LU decomposition time \t:" << lu_numerical.get_time() << std::endl;
std::cout << "Thread" << thread_no << " symbolic free time: \t"<<lu_symbolic_init.get_time()<<std::endl;
std::cout << "Thread" << thread_no << " LU solve time \t: " << lu_solve_time.get_time() <<std::endl;

}
}
void * psampleLU(void *arg)
{
parm *p = (parm *)arg;
sampleLU(p->thread_no, p->allthread, p->G, p->C, p->B, *(p->us), *(p->Z), *(p->samples), p->Control, p->Info);
return NULL;
}

int main(int argc, char* argv[]){
pthread_t *threads;
pthread_attr_t pthread_custom_attr;

parm *arg;

threads = (pthread_t *)malloc(allthread * sizeof(pthread_t));
pthread_attr_init(&pthread_custom_attr);

arg = (parm *)malloc(allthread * sizeof(parm));

for ( int i=0; i<allthread; i++){
arg[i].thread_no = i;
arg[i].allthread = allthread;
arg[i].G = G;
arg[i].C = C;
arg[i].B = B;
arg[i].us = &us;
arg[i].Z = &Z;
arg[i].samples = &samples;
arg[i].Control = Control;
arg[i].Info = Info;
/*arg[i].dim = NDIM;
arg[i].a = &a;
arg[i].b = &b;
arg[i].c = &c;*/
if(i == 0) pthread_samplingLU.start();
pthread_create(&threads[i], &pthread_custom_attr, psampleLU,(void*)(arg+i));
//pthread_create(&threads[i], NULL, psampleLU,(void*)(arg+i));
}

for ( int i=0; i<allthread; i++){
pthread_join(threads[i], NULL);
if(i == 0) pthread_samplingLU.stop();
}

free(arg);
}
}
 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

pthread()

I have a while loop like so: while (counter (file1)); how can I pass that into a pthread_create()? I was thinking ... while(pthread_create(&path, NULL, counter, file)); is that right? (1 Reply)
Discussion started by: l flipboi l
1 Replies

2. Ubuntu

pthread problem

Hi all, I wrote some code in c, using pthread (I configured the linker and compiler in eclipse IDE first). #include <pthread.h> #include "starter.h" #include "UI.h" Page* MM; Page* Disk; PCB* all_pcb_array; void* display_prompt(void *id){ printf("Hello111\n"); return... (1 Reply)
Discussion started by: elad2109
1 Replies

3. UNIX for Advanced & Expert Users

pthread

I am so confused about the user threads and kernel threads.Suppose I created a thread using pthread create call in Linux ,whether it will be a user thread or kernel thread.If it user thread,then how its map to kernel thread. I heard about the M:1,M:N,1:1 mapping methods.Which method linux is... (1 Reply)
Discussion started by: sujith4u87
1 Replies

4. Programming

How can I parallize using pthread

Hi all, How can i parallize this code in pthread? for(round=1;round<=16;round++) { Expansion(mid, 17 - round - 1, left); Expansion(mid, round - 1, right); round++; Expansion(right, 17 - round - 1, mid); Expansion(left, round - 1,mid); } Whereby each loop depend on the... (2 Replies)
Discussion started by: m_enayah
2 Replies

5. Programming

PThread and More Than 1 Core

Hello all. I have made an application in C using pthreads. My problem is that my program seems to be only using 1 of my cores when I create multiple threads. I have 4 cores (Q9300). I am using Ubuntu 8.04. I do believe the problem is that on linkage it's using a pthread emulation package... (4 Replies)
Discussion started by: LightRaven
4 Replies

6. Programming

Problem with pointers, structures, and Pthread

Hello all, I'm working on a small wrapper library for a bigger project, and i've been killing my self over (what I think is) a pointer problem. Here is the code (I extracted the part of the code where the problem is for better reading, I tested the code below, and I get the same problem):... (13 Replies)
Discussion started by: tmp0
13 Replies

7. Solaris

pthread problem

Hi all! I am working on unix systems.I am programming in c. I have got some problems with pthread.when I use pthread_create to creat a thread it says: (.text+0x3a): undefined reference to `pthread_create'. same is the problm with pthread_kill. Can anyone help me out here. Thanks. vij. (2 Replies)
Discussion started by: vijlak
2 Replies

8. Programming

pthread.h

hallo 2 al can anyone pls tell me where and how can i find and install the pthread.h lib ? thx :cool: (2 Replies)
Discussion started by: XinU*
2 Replies

9. Programming

pthread

consider if the thread routine returns any void pointer while calling pthread_join, the thread resources are freed and the thread will be terminated when the main thread is exit ,that is my assumption whether it is true how do we find whether the thread is alive or terminated how do we find... (0 Replies)
Discussion started by: MKSRaja
0 Replies

10. Programming

More about Pthread

Can someone point to a link where I can get good info about pthread? thanx.. :) (1 Reply)
Discussion started by: jyotipg
1 Replies
Login or Register to Ask a Question