草庐IT

c++ - 有符号的 8 位元素的 AVX2 整数乘法,产生有符号的 16 位结果?

我有两个__m256ivector,填充了32个8位整数。像这样:__int8*a0=new__int8[32]{2};__int8*a1=new__int8[32]{3};__m256iv0=_mm256_loadu_si256((__m256i*)a0);__m256iv1=_mm256_loadu_si256((__m256i*)a1);我如何使用类似_mm256_mul_epi8(v0,v1)(不存在)或任何其他方式来乘以这些vector?我想要2个结果vector,因为输出元素宽度是输入元素宽度的两倍。或者类似于_mm_mul_epu32的东西也可以,只使用偶数输入元素(0、

c++ - Boost Enum 256 元素限制

我正在使用BoostVault中的枚举v4.6库(提到here[stackoverflow.com]),但遇到了256的元素限制(即每个枚举的最大元素数=256)。我知道这与boost预处理器库有关,一些调查使我找到了boost/preprocessor/config/limits.hpp,但更改这些值没有任何效果,因为它们纯粹是“信息”(link[groups.google.com])有什么办法可以增加这个限制吗? 最佳答案 遗憾的是,无法增加可与Boost预处理器库一起使用的元素/参数的上限。因此,由于枚举库依赖于Boost.P

c++ - 使用 AVX 指令实现 _mm256_permutevar8x32_ps

AVX2内在_mm256_permutevar8x32_ps可以跨channel执行洗牌,这对于长度为8的数组排序非常有用。现在我只有AVX(IvyBridge)并且想在最少的周期内做同样的事情。请注意,数据和索引都是输入的,并且在编译时是未知的。例如,数组是[1,2,3,4,5,6,7,8],索引是[3,0,1,7,6,5,2,4],输出应该是[4,1,2,8,7,6,3,5]。大多数方便的内部函数的控制掩码必须是常量(没有“var”后缀),因此不适合这种情况。提前致谢。 最佳答案 要在AVX中跨channel置换,您可以在cha

c++ - AVX2 赢家通吃差异搜索

我正在使用AVX2优化视差估计算法的“赢家通吃”部分。我的标量例程是准确的,但在QVGA分辨率和48个视差下,我的笔记本电脑上的运行时间慢得令人失望,大约为14毫秒。我创建了LR和RL视差图像,但为了简单起见,我将只包含RL搜索的代码。我的标量例程:intMAXCOST=32000;for(inti=maskRadius;i我尝试使用AVX2:intMAXCOST=32000;int*dispVals=(int*)_mm_malloc(sizeof(int32_t)*16,32);for(inti=maskRadius;i视差空间图像(DSI)的大小为HxWxD(320x240x48)

c++ - Ruby FFI 找不到某些功能?

我正在尝试使用Ruby的FFI库链接来自bitcoin-coresecp256k1library的函数.制作secp256k1_ecdsa_sign功能可访问,我使用autotools构建了libsecp256k1(按照README.md中的指示)。然后,我通过运行g++-sharedsecp256k1/src/.libs/libsecp256k1_la-secp256k1.o创建了一个要在FFI中使用的共享对象。使用FFI将其导入到我的Ruby文件中,让我可以使用该函数并且一切正常。我正在尝试对secp256k1_ecdsa_sign_recoverable执行完全相同的操作函数,它

c++ - 使用 AVX2 将 8 位从 32 位值 (__m256i) 解压到 __m256 的最快方法

我有一个名为A的数组,它包含32个unsignedchar值。我想使用此规则将这些值解压缩到4个__m256变量中,假设我们有一个从0到31的索引,关于A中的所有值,解压缩的4变量将具有这些值:B_0=A[0],A[4],A[8],A[12],A[16],A[20],A[24],A[28]B_1=A[1],A[5],A[9],A[13],A[17],A[21],A[25],A[29]B_2=A[2],A[6],A[10],A[14],A[18],A[22],A[26],A[30]B_3=A[3],A[7],A[11],A[15],A[19],A[23],A[27],A[31]为此,我有

c++ - 如何优化 SIMD 转置函数(8x4 => 4x8)?

我需要使用AVX优化8x4和4x8浮点矩阵的转置。我使用AgnerFog的vectorclasslibrary.青色任务-构建BVH并求和最小值-最大值。转置用于每个循环的最后阶段(它们也通过多线程进行了优化,但任务确实很多)。代码现在看起来像:voidtranspose(registerVec4f(&fin)[8],registerVec8f(&mat)[4]){for(inti=0;i(Vec4i(0,8,16,24)+i,(float*)mat);}}需要优化的变体。如何为SIMD优化此功能?我最近用vector类编写了自己的转置变体(4x8和8x4)。版本1.0。voidtra

c++ - 如何使用 avx 指令将 float vector 转换为 short int?

基本上,我如何使用AVX2内在函数编写与此等效的内容?我们这里假设result_in_float是__m256类型,而result是shortint*或短整数[8]。for(i=0;i我知道可以使用__m256i_mm256_cvtps_epi32(__m256m1)内在函数将float转换为32位整数,但不知道如何将这些32位整数进一步转换为16位整数。而且我不仅想要那个,还想要将这些值(以16位整数的形式)存储到内存中,我想全部使用vector指令来完成。在互联网上搜索,我发现了一个名为_mm256_mask_storeu_epi16的内在函数,但我不确定这是否能解决问题,因为我找

c++ - shuffle/permute 内在函数如何为 256 位 pd 工作?

我正在努力思考_mm256_shuffle_pd和_mm256_permute_pd内在函数的工作原理。我似乎无法预测其中一项操作的结果。首先,_mm_shuffle_ps一切正常。我得到的结果是我所期望的。例如:floatb[4]={1.12,2.22,3.33,4.44};__m128a=_mm_load_ps(&b[0]);a=_mm_shuffle_ps(a,a,_MM_SHUFFLE(3,0,1,2));_mm_store_ps(&b[0],a);//3.332.221.124.44所以一切都在这里。现在我想用我目前在我的代码中使用的__m256d来尝试这个。据我发现,_mm

c++ - AVX计算精度

我写了一个程序来显示mandelbrot集。为了加快速度,我通过使用了AVX(实际上是AVX2)指令。header。问题是:AVX计算(double)的结果有伪影,它与使用“正常”double计算的结果不同。详细来说,有一个函数getIterationCount它计算直到mandelbrot序列超过4的迭代次数,或者如果序列在前N个步骤中不超过4,则假定该点包含在集合中。代码如下所示:#include"stdafx.h"#include#include#includeclassMandelbrotSet{public:intgetIterationCount(conststd::com