Операция SIMD XOR не так эффективна, как целое число XOR?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Операция SIMD XOR не так эффективна, как целое число XOR?

Сообщение Anonymous »

У меня есть задача для расчета Xor-sum байтов в массиве: < /p>

X = char1 XOR char2 XOR char3 ... charN;
< /code>

Я пытаюсь параллелизировать его, xoring __m128 вместо этого. Это должно отказаться от фактора скорости 4.
также, чтобы перепроверить алгоритм, который я использую int. Это должно отказаться от фактора скорости 4.
Программа испытаний составляет 100 линий, я не могу сделать его короче, но это просто: < /p>

#include "xmmintrin.h" // simulation of the SSE instruction
#include

#include
using namespace std;

#include // rand

const int NIter = 100;

const int N = 40000000; // matrix size. Has to be dividable by 4.
unsigned char str[N] __attribute__ ((aligned(16)));

template< typename T >
T Sum(const T* data, const int N)
{
T sum = 0;
for ( int i = 0; i < N; ++i )
sum = sum ^ data;
return sum;
}

template
__m128 Sum(const __m128* data, const int N)
{
__m128 sum = _mm_set_ps1(0);
for ( int i = 0; i < N; ++i )
sum = _mm_xor_ps(sum,data);
return sum;
}

int main() {

// fill string by random values
for( int i = 0; i < N; i++ ) {
str = 256 * ( double(rand()) / RAND_MAX ); // put a random value, from 0 to 255
}

/// -- CALCULATE --

/// SCALAR

unsigned char sumS = 0;
std::clock_t c_start = std::clock();
for( int ii = 0; ii < NIter; ii++ )
sumS = Sum( str, N );
double tScal = 1000.0 * (std::clock()-c_start) / CLOCKS_PER_SEC;

/// SIMD

unsigned char sumV = 0;

const int m128CharLen = 4*4;
const int NV = N/m128CharLen;

c_start = std::clock();
for( int ii = 0; ii < NIter; ii++ ) {
__m128 sumVV = _mm_set_ps1(0);
sumVV = Sum( reinterpret_cast(str), NV );
unsigned char *sumVS = reinterpret_cast(&sumVV);

sumV = sumVS[0];
for ( int iE = 1; iE < m128CharLen; ++iE )
sumV ^= sumVS[iE];
}
double tSIMD = 1000.0 * (std::clock()-c_start) / CLOCKS_PER_SEC;

/// SCALAR INTEGER

unsigned char sumI = 0;

const int intCharLen = 4;
const int NI = N/intCharLen;

c_start = std::clock();
for( int ii = 0; ii < NIter; ii++ ) {
int sumII = Sum( reinterpret_cast(str), NI );
unsigned char *sumIS = reinterpret_cast(&sumII);

sumI = sumIS[0];
for ( int iE = 1; iE < intCharLen; ++iE )
sumI ^= sumIS[iE];
}
double tINT = 1000.0 * (std::clock()-c_start) / CLOCKS_PER_SEC;

/// -- OUTPUT --

cout

Подробнее здесь: https://stackoverflow.com/questions/233 ... nteger-xor
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»