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
,尽管您实际上想存储整数。因此,要么使用_mm_store_si128
或将结果归还为uint64_t
。
您还应该确保将数组与16个字节相提并论,因此可以使用对齐的负载/存储操作,这将更快。
#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);
}
相关文章:
- 将字符串存储在c++中的稳定内存中
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 使用QProcess执行命令,并将结果存储在QStringList中
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 存储模板类型以强制转换回派生<T>
- 类型总是使用其大小存储在内存中吗
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 使用无符号字符数组有效存储内存
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 带结构的二维矢量:如何存储元素
- 添加存储在向量中的大整数的函数出现问题
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 在std::vector上存储带有模板的类实例
- 谷歌测试中的期望值存储在哪里
- 为什么C中的通用链表中存储的数据已损坏
- 在c++中获取两个大int,并将它们存储在数组中
- 在reactor中存储eventHandlers的最佳方式是什么