1) Я не вижу какой-либо код дела с выравниванием
2) Там несоответствие между беззнаковым целым и _mm_max_epi8 которого comapares 8-разрядным целые числа (http://msdn.microsoft.com/en-us/library/bb514045(v=vs.90).aspx)
3) Я предполагаю, что у вас есть матрица ah * w со строками, кратными 4 (или, например, с этим дополнением)
В Windows вы могли бы сделать что-то вроде:
#include "windows.h"
#include <malloc.h>
#include <smmintrin.h>
#include <iostream>
using namespace std;
void max_sse(unsigned int *src, long h, long w, unsigned int *val)
{
_STATIC_ASSERT(sizeof(unsigned int) == sizeof(BYTE)*4);
if(w % 4 != 0)
return; // ERROR Can't do it, need 4-multiple rows or do some alignment!
unsigned int *aligned_src = (unsigned int*)_aligned_malloc(h*w*sizeof(unsigned int), 16); // _mm_load_si128 needs 16-bytes aligned memory
memcpy(aligned_src, src, sizeof(unsigned int)*h*w);
__declspec(align(16)) __m128i max = {0,0,0,0};
// Iterates the matrix
for(int i=0; i<h*w; i+=4)
{
__m128i *pg = (__m128i*)(aligned_src+i);
__m128i PG = _mm_load_si128(pg);
__m128i newmax = _mm_max_epu32(max, PG);
_mm_store_si128(&max, newmax);
}
unsigned int abs_max = 0;
unsigned int *max_val = (unsigned int*)&max;
for (int i=0;i<4;i++)
{
if (abs_max < *(max_val+i))
{
abs_max = *(max_val+i);
}
}
_aligned_free(aligned_src);
cout << "The max is: " << abs_max << endl;
}
int main()
{
unsigned int src[] = {0,1,2,4, 5,6,7,8, 224,225,226,129};
unsigned int val;
max_sse(src, 3,4, &val);
return 0;
}
я предполагаю тетсру необходимое зло в вашем коде, так как нет никакой другой информации о выравнивании памяти. Если у вас есть что-то с этим, сделайте это сами, и это будет намного лучше.
Любая помощь пожалуйста ??? –
Какой формат является вашим изображением? Действительно ли это 32 бита на пиксель (при условии, что int 32 бит) или каждый int действительно, скажем, RGBA? И если это RGB, то какой максимум вы ищете? Раздельный максимум для каждого компонента или что? –