Matrix multiplication

Zdenko oknedz at gmail.com
Tue Jan 4 07:22:33 EST 2011


On 4.1.2011 11:15, Ulrich Eckhardt wrote:
> Zdenko wrote:
>> Please, can anybody write me a simple recursive matrix multiplication
>> using multiple threads in Python, or at least show me some guidelines
>> how to write it myself
>
> No problem, I just need your bank account data to withdraw the payment and
> the address of your teacher whom to send the results. ;^)
>
> Seriously, things don't work like this. If you show effort, you will get
> help, but you don't get working solutions without even a bit of effort on
> your own.
>
> Start with a recursive algorithm, then make it multithreaded. Be prepared to
> make some experiments on how to distribute tasks to threads and collect
> them again.
>
> Uli
>

Ok, I expected something like this :)
Lets try this way:

I wrote these two codes for example:

this one is naive way of matrix multiplication using one thread

from random import *
from time import clock
import threading

t0 = clock()
A=[]
B=[]
C=[]
m=300  #size of matrix m x m

for i in range(m):
     A.append([])
     B.append([])
     C.append([])
     for j in range(m):
         A[i].append(randint(1,9))
         B[i].append(randint(1,9))
         C[i].append(0)

class MyThread ( threading.Thread ):

    def run ( self ):
            for i in range(m):
                 for j in range(m):
                     for k in range(m):
                         C[i][j]+=A[i][k]*B[k][j]

t=MyThread()
t.start()
t.join()
print clock() - t0, "seconds"



this one is using two threads, each one is multiplying half of matrix

import time
from threading import Thread
from random import randint

t0 = time.clock()
class MyThread(Thread):
     def __init__(self, poc, kr):
         Thread.__init__(self)
         self.poc=poc
         self.kr=kr
     def run(self):
            for i in range(self.poc,self.kr):
                 for j in range(m):
                     for k in range(m):
                         C[i][j]+=A[i][k]*B[k][j]

A=[]
B=[]
C=[]
m=300 #size of matrix m x m

for i in range(m):
     A.append([])
     B.append([])
     C.append([])
     for j in range(m):
         A[i].append(randint(1,9))
         B[i].append(randint(1,9))
         C[i].append(0)
thr1=MyThread(0,m/2)
thr2=MyThread(m/2,m)
thr1.start()
thr2.start()
thr1.join()
thr2.join()
print time.clock() - t0, "seconds"

why is second one more than twice slower than first when it should be 
faster. I suspect that problem is in simultaneous access to matrix C but 
i don't know how to solve this.

I used this just for example to see how the threading works so i can 
work on recursive and Strassen algorithm.



More information about the Python-list mailing list