2015-10-27 3 views
1

Я пытаюсь написать две функции матричного умножения, одну стандартную и одну, которая имеет резьбу. Тем не менее, я не могу понять, как правильно называть поточную функцию.функция умножения на резьбовую матрицу

Вот код:

#include <iostream> 
#include <future> 
#include <sys/time.h> 
#include <stdio.h> 
#include <thread> 

using namespace std; 

double get_wallTime() { 
    struct timeval tp; 
    gettimeofday(&tp, NULL); 
    return (double) (tp.tv_sec + tp.tv_usec/1000000.0); 
} 



static void matrixMultiply(double** a, double** b, double** product, int size) { 

    for (int i = 0; i < size; i++) { 
     for (int j = 0; j < size; j++) { 
      for (int k = 0; k < size; k++) { 
      product[i][j] += a[i][k] * b[k][j]; 
      } 
     } 
    } 


} 

static void matrixMultiplyThreaded(double** a, double** b, double** product, int dimLower, int dimUpper, int dim) { 
    for (int i = dimLower; i < dimUpper; i++) { 
     for (int j = 0; j < dim; j++) { 
      for (int k = 0; k < dim; k++) { 
       product[i][j] += a[i][k] * b[k][j]; 
      } 
     } 
    } 
} 

int main(int argc, char *argv[]) { 
    if (argc < 3) { 
     cout << "Not enough arguments."; 
    } 
    int numTimes = atoi(argv[1]); 
    char *threadOrNo = argv[2]; 
    int size = atoi(argv[3]); 
    double a[size][size], b[size][size] = {}; 
    double product[size][size] = {}; 

    for (int i=0; i<size; i++) { 
     for (int j=0; j < size; j++) { 
      a[i][j] = 2; 
      b[i][j] = 3; 
     } 
    } 
    double t1 = get_wallTime(); 
    if (*threadOrNo == 'y') { 
     int dim1 = size/2; 
     for (int n = 0; n < numTimes; n++) { 
      std::thread first (matrixMultiplyThreaded, a, b, product, 0, dim1, size); 

      std::thread second (matrixMultiplyThreaded, a, b, product, dim1, size, size); 
      first.join(); 
      second.join(); 
      } 
    } 
    else { 
     for (int m = 0; m < numTimes; m++) { 

      matrixMultiply(a[size][size],b[size][size], product[size][size], size); 
    } 
    } 
    double t2 = get_wallTime(); 
    double totalTime = t2 - t1; 
    cout << "time : " << totalTime; 


} 

Если кто-то может дать какой-либо совет, который я бы бесконечно благодарен. В частности, каков правильный способ реализации потоков для потоковой функции?

Вот первое сообщение об ошибке я получаю, что я пытался исправить несколько раз:

multiplyMatrix.cpp: In function 'int main(int, char**)': 
multiplyMatrix.cpp:64:82: error: no matching function for call to 'std::thread::thread(void (&)(double**, double**, double**, int, int, int), double [size][size], double [size][size], double [size][size], int, int&, int&)' 
      std::thread first (matrixMultiplyThreaded, a, b, product, 0, dim1, size); 
+0

[Вы уверены, что] (http://lwn.net/Articles/255364/) вам нужно РЕЗЬБА [ улучшить производительность] (http://lwn.net/Articles/258188/) здесь, или это просто упражнение? (См. Раздел 6.2.1) – tweej

ответ

0

Я не мог скомпилировать код из-за другие ошибки, но для той части, которая запускает потоки, вы должны использовать лямбды:

std::thread first([=]() { matrixMultiplyThreaded(a, b, product, 0, dim1, size); }); 
std::thread second([=]() { matrixMultiplyThreaded(a, b, product, dim1, size, size); }); 

Среди других ошибок, вы не можете статически выделить массивы (a, b и product) с переменной (которая представляет собой динамическое значение). Выполните следующие действия:

double **a = new double*[size]; 
double **b = new double*[size]; 
double **product = new double*[size]; 
for (int i = 0; i < size; i++) 
{ 
    a[i] = new double[size]; 
    b[i] = new double[size]; 
    product[i] = new double[size]; 
} 

И не забудьте free те после этого, если вы не готовы использовать shared_ptr или shared_array.

Я бы не опубликовал две версии matrixMultiply. Удалите matrixMultiply и используйте только matrixMultiplyThreaded (его следует переименовать). Если вы хотите reaaaaally выставить matrixMultiply без размытых параметров, код с точки зрения matrixMultiplyThreaded:

static void matrixMultiply(double** a, double** b, double** product, int size) { 
    matrixMultiplyThreaded(a, b, product, 0, size, size); 
} 
Смежные вопросы