2014-04-18 3 views
0

Я пытаюсь запрограммировать умножение матрицы, используя SSE Intrinsic. Я не уверен, если мой код правильно, и я не могу компилятор это либо потому, что я получаю сообщение об ошибке:Матричное умножение с использованием ошибки SSE __m128 to * float conversion?

Error 1 error C2440: 'type cast' : cannot convert from 'float' to '__m128 * 

Может кто-то двойное проверить свою программу так, чтобы мое матричное умножение является правильным? Заметим также, что это для квадратной матрицы.

Вот мой код.

void Intrinsics (float * matrix_a, float * matrix_b, float * matrix_result, const int num_row, const int num_col) { 
    __declspec(align(16)) float * a = matrix_a; 
    __declspec(align(16)) float * b = matrix_b; 
    __declspec(align(16)) float * c = matrix_result; 

    for(int i = 0; i < num_row; ++i) 
    { 
     for(int j = 0; j < num_col; ++j) 
     { 
      __m128 *m3 = (__m128*)a[i];  // The error is here. 
      __m128 *m4 = (__m128*)b[j]; 
      float* res; 
      *(c + (j * num_col + i)) = 0; 
      for(int k = 0; k < num_col; k += 4) 
      { 
       __m128 m5 = _mm_mul_ps(*m3,*m4); 
       res = (float*)&m5; 
       *(c + (j * num_col + i)) += res[0]+res[1]+res[2]+res[3]; 
       m3++; 
       m4++; 
      } 
     } 
    } 
} 
+0

Хотя код строка ошибка связана с? – ArtemB

+0

обновленный код с линией ошибки –

ответ

1

Я предполагаю, что это __m128 *m3 = (__m128*)a[i]; и линия после того, что производят ошибку. Вы пытаетесь ввести float в указатель в __m128, компилятор которого прав, чтобы жаловаться.

Я не знаю деталей предполагаемого алгоритма. Если предположить, что намерение состоит в том, чтобы получить доступ четыре поплавки а [я] .. а [я + 3] в качестве одного __m128, вам нужно что-то вроде этого:

__m128 *m3 = (__m128*)&a[i]; 
__m128 *m4 = (__m128*)&b[j]; 

или эквивалент:

__m128 *m3 = (__m128*)(a + i); 
__m128 *m4 = (__m128*)(b + j); 
+0

Нельзя напрямую обращаться к полям __m128. Однако вы можете видеть эти типы в отладчике. Переменная типа __m128 сопоставляется с регистрами XMM [0-7]. Переменные типа _m128 автоматически выравниваются по 16-байтовым границам. –

+0

в соответствии с некоторыми микрософт что-то я только что прочитал :) –

+0

Здесь мы имеем дело с синтаксической ошибкой - попытайтесь назначить поплавок указателю. То, что пользователь пытается сделать с данными, на которые он указывает, - это другая проблема, которая может потребовать его собственный вопрос. :-) – ArtemB

Смежные вопросы