Jump to content
Pedro Vieira

Lock-Free com operações atómicas

Recommended Posts

Pedro Vieira

Boa tarde,

Estou a desenvolver algumas pequenas scripts para multiplicação de Matrizes com Threads e já desenvolvi algumas delas.

A função basica de multiplicação sem Threads é a seguinte:

void matrixMulSingle(float* arrayA, float* arrayB, float* arrayC, int widthA, int heightA, int widthB, int heightB){
   int sizeA = widthA*heightA;
   int sizeB = widthB*heightB;

   int valAux;

   for(int i=0;i<heightA;i++){
       for(int j=0;j<widthB;j++){

           for(int aux=0; aux < widthA; aux++){
               float valA = arrayA[aux+widthA*((i*widthB+j)/widthB)];
               float valB = arrayB[aux*widthB+j];
               arrayC[i*widthB+j] += valA*valB;
           }
       }
   }
}

para criar threads com esta função o que fiz foi alterar a função onde definia a partir de que gaveta e até que gaveta do array ia calcular, dessa forma conseguia criar varias threads e indicar a cada thread que gaveta teria que calcular.

No entanto agora tenho que desenvolver o mesmo mas utilizando um método Lock-Free com operações atómicas, será que alguém me pode explicar na teoria o que tenho que fazer de diferente ? pois não vejo aqui nenhuma variavel do tipo RMW (Read-Modify-Write) . . .

Os melhores cumprimentos,

Pedro Vieira

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

quando a esmola é muita, o pobre desconfia ... mas às vezes sem razão ...

diz lá então se a tua solução de calcular a matriz com o auxílio de múltiplos fios-de-execução onde cada um calcula uma secção da matriz resultado, usas algum tipo de locking ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Pedro Vieira

Não porque eu digo por exemplo que a Thread 1 vai fazer as contas da gaveta 0 até à 99 e a Thread 2 faz as contas da gaveta 100 até 199 . . então não existe nenhuma gaveta que seja partilhada por outras threads . .

Share this post


Link to post
Share on other sites
HappyHippyHippo

Não porque eu digo por exemplo que a Thread 1 vai fazer as contas da gaveta 0 até à 99 e a Thread 2 faz as contas da gaveta 100 até 199 . . então não existe nenhuma gaveta que seja partilhada por outras threads . .

conclusão ... é uma solução lock-free, porque não executas nenhuma restrição de acesso e ou escrita aos dados da matrix


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Pedro Vieira

conclusão ... é uma solução lock-free, porque não executas nenhuma restrição de acesso e ou escrita aos dados da matrix

Exato, no entanto o meu professor diz-me isto:

you will create threads. But, you will not use critical sections nor semaphores. You will use atomic instructions to synchronize the calculation

portanto, pelo que percebi tenho que fazer uma divisão diferente de operações por cada thread . .

Share this post


Link to post
Share on other sites
HappyHippyHippo

isso já é outra coisa ...

para que sistema operativo estas a programar ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Pedro Vieira

MacOS ou Windows. . tenho MacOS mas estou a utilizar uma VM com Windows para utilizar WinAPI entre outros, por isso o mais certo é fazer este passo também no Visual Studio.

Share this post


Link to post
Share on other sites
Pedro Vieira

Obrigado HappyHippo mas diz-me só uma coisa, como vou divir isto em Threads agora ? que trabalho dou a qual ? para que exista este problema de acessos a variaveis partilhadas ?

Share this post


Link to post
Share on other sites
Rui Carlos

A necessidade de controlo da concorrência depende de como fazes a divisão do trabalho.

Por exemplo, assumindo que só divides a matriz A, se atribuíres subconjuntos de colunas a cada thread (n colunas para uma, mais n colunas para outra, etc.), todas as threads vão escrever em toda a matriz C. Já se atribuíres subconjuntos das linhas a cada thread (n linhas para uma, mais n linhas para outra, etc.), cada thread também só irá aceder a um subconjunto equivalente de linhas da matriz C, a que significa que não haverá problemas de concorrência.

Existem mais uma série de alternativas para dividir matrizes, algumas que precisam de controlo da concorrência, e outras que não precisam.

Escolher uma divisão que também divide a matriz C é boa ideia, quer porque evita problemas de concorrência, quer porque evita problemas de invalidação da cache, que facilmente dão cabo dos benefícios de usar paralelismo.

No entanto, é possível que o teu professor queira que usas uma variante que precise de operações atómicas.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.