У меня есть задача для расчета 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
Операция SIMD XOR не так эффективна, как целое число XOR? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Ошибка API критериев: оператор не существует: целое число = целое число []
Anonymous » » в форуме JAVA - 0 Ответы
- 62 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Ошибка API критериев: оператор не существует: целое число = целое число []
Anonymous » » в форуме JAVA - 0 Ответы
- 46 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Ошибка API критериев: оператор не существует: целое число = целое число []
Anonymous » » в форуме JAVA - 0 Ответы
- 65 Просмотры
-
Последнее сообщение Anonymous
-