C++ SIMD:按位与运算后存储uint64_t值
C++ SIMD: Store uint64_t value after bitwise and operation
我正在尝试在两个 uint64_t
整数数组的元素之间按位 &
,然后将结果存储在另一个数组中。这是我的程序:
#include <emmintrin.h>
#include <nmmintrin.h>
#include <chrono>
int main()
{
uint64_t data[200];
uint64_t data2[200];
uint64_t data3[200];
__m128i* ptr = (__m128i*) data;
__m128i* ptr2 = (__m128i*) data2;
uint64_t* ptr3 = data3;
for (int i = 0; i < 100; ++i, ++ptr, ++ptr2, ptr3 += 2)
_mm_store_ps(ptr3, _mm_and_si128(*ptr, *ptr2));
}
但是,我得到这个错误:
test.cpp:17:50: error: cannot convert ‘uint64_t* {aka long unsigned int*}’ to ‘float*’ for argument ‘1’ to ‘void _mm_store_ps(float*, __m128)’
_mm_store_ps(ptr3, _mm_and_si128(*ptr, *ptr2));
出于某种原因,编译器认为我正在复制到一个浮点数组。是否可以用 uint64_t
的数组做我想做的事情?
您可以使用 _mm_store_si128
.
首先将指针 ptr3
更改为
__m128i* ptr3 = (__m128i*) data3;
然后
for (int i = 0; i < 100; ++i, ++ptr, ++ptr2, ++ptr3)
_mm_store_si128(ptr3, _mm_and_si128(*ptr, *ptr2));
您正在使用浮点运算 _mm_store_ps
although you actually want to store integers. So either use _mm_store_si128
或将结果转换回 uint64_t
。
您还应确保将数组对齐到 16 字节,这样可以使用对齐的 load/store 操作,速度会更快。
#include <emmintrin.h>
#include <nmmintrin.h>
#include <chrono>
int main()
{
__declspec(align(16)) uint64_t data[200];
__declspec(align(16)) uint64_t data2[200];
__declspec(align(16)) uint64_t data3[200];
__m128i* ptr = (__m128i*) data;
__m128i* ptr2 = (__m128i*) data2;
__m128i* ptr3 = (__m128i*) data3;
for (int i = 0; i < 100; ++i, ++ptr, ++ptr2, ++ptr3)
*ptr3 = _mm_and_si128(*ptr, *ptr2);
}
我正在尝试在两个 uint64_t
整数数组的元素之间按位 &
,然后将结果存储在另一个数组中。这是我的程序:
#include <emmintrin.h>
#include <nmmintrin.h>
#include <chrono>
int main()
{
uint64_t data[200];
uint64_t data2[200];
uint64_t data3[200];
__m128i* ptr = (__m128i*) data;
__m128i* ptr2 = (__m128i*) data2;
uint64_t* ptr3 = data3;
for (int i = 0; i < 100; ++i, ++ptr, ++ptr2, ptr3 += 2)
_mm_store_ps(ptr3, _mm_and_si128(*ptr, *ptr2));
}
但是,我得到这个错误:
test.cpp:17:50: error: cannot convert ‘uint64_t* {aka long unsigned int*}’ to ‘float*’ for argument ‘1’ to ‘void _mm_store_ps(float*, __m128)’
_mm_store_ps(ptr3, _mm_and_si128(*ptr, *ptr2));
出于某种原因,编译器认为我正在复制到一个浮点数组。是否可以用 uint64_t
的数组做我想做的事情?
您可以使用 _mm_store_si128
.
首先将指针 ptr3
更改为
__m128i* ptr3 = (__m128i*) data3;
然后
for (int i = 0; i < 100; ++i, ++ptr, ++ptr2, ++ptr3)
_mm_store_si128(ptr3, _mm_and_si128(*ptr, *ptr2));
您正在使用浮点运算 _mm_store_ps
although you actually want to store integers. So either use _mm_store_si128
或将结果转换回 uint64_t
。
您还应确保将数组对齐到 16 字节,这样可以使用对齐的 load/store 操作,速度会更快。
#include <emmintrin.h>
#include <nmmintrin.h>
#include <chrono>
int main()
{
__declspec(align(16)) uint64_t data[200];
__declspec(align(16)) uint64_t data2[200];
__declspec(align(16)) uint64_t data3[200];
__m128i* ptr = (__m128i*) data;
__m128i* ptr2 = (__m128i*) data2;
__m128i* ptr3 = (__m128i*) data3;
for (int i = 0; i < 100; ++i, ++ptr, ++ptr2, ++ptr3)
*ptr3 = _mm_and_si128(*ptr, *ptr2);
}