libSIMDx86-devel-src-0.3.2a.zip

  • PUDN用户
    了解作者
  • Visual C++
    开发工具
  • 78KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 24
    下载次数
  • 2006-07-09 06:57
    上传日期
SIMD 指令优化。 包含样例和测试代码。
libSIMDx86-devel-src-0.3.2a.zip
内容介绍
/* matrix.c -- SIMDx86 Matrix Library Written by Patrick Baggett, 2005 (baggett.patrick@gmail.com) Under LGPL License Part of SIMDx86 Project */ #include <SIMDx86/matrix.h> #include <memory.h> /* memcpy() */ void SIMDx86Matrix_Sum(SIMDx86Matrix* Out, const SIMDx86Matrix* In) { #if defined(USE_SSE) asm( "movups (%0), %%xmm0\n" "movups 16(%0), %%xmm1\n" "movups 32(%0), %%xmm2\n" "movups 48(%0), %%xmm3\n" "movups (%1), %%xmm4\n" "movups 16(%1), %%xmm5\n" "movups 32(%1), %%xmm6\n" "movups 48(%1), %%xmm7\n" "addps %%xmm0, %%xmm4\n" "addps %%xmm1, %%xmm5\n" "addps %%xmm2, %%xmm6\n" "addps %%xmm3, %%xmm7\n" "movups %%xmm4, (%0)\n" "movups %%xmm5, 16(%0)\n" "movups %%xmm6, 32(%0)\n" "movups %%xmm7, 48(%0)\n" : : "r" (Out), "r" (In) ); #elif defined(USE_3DNOW) asm( "movq (%0), %%mm0\n" "movq 8(%0), %%mm1\n" "movq 16(%0), %%mm2\n" "movq 24(%0), %%mm3\n" "movq 32(%0), %%mm4\n" "movq 40(%0), %%mm5\n" "movq 48(%0), %%mm6\n" "movq 56(%0), %%mm7\n" "pfadd (%1), %%mm0\n" "pfadd 8(%1), %%mm1\n" "pfadd 16(%1), %%mm2\n" "pfadd 24(%1), %%mm3\n" "pfadd 32(%1), %%mm4\n" "pfadd 40(%1), %%mm5\n" "pfadd 48(%1), %%mm6\n" "pfadd 56(%1), %%mm7\n" "movq %%mm0, (%0)\n" "movq %%mm1, 8(%0)\n" "movq %%mm2, 16(%0)\n" "movq %%mm3, 24(%0)\n" "movq %%mm4, 32(%0)\n" "movq %%mm5, 40(%0)\n" "movq %%mm6, 48(%0)\n" "movq %%mm7, 56(%0)\n" : : "r" (Out), "r" (In) ); /* Execute 'femms' if desired */ #ifndef NO_EMMS asm("femms\n"); #endif #else Out->m[ 0] += In->m[ 0]; Out->m[ 1] += In->m[ 1]; Out->m[ 2] += In->m[ 2]; Out->m[ 3] += In->m[ 3]; Out->m[ 4] += In->m[ 4]; Out->m[ 5] += In->m[ 5]; Out->m[ 6] += In->m[ 6]; Out->m[ 7] += In->m[ 7]; Out->m[ 8] += In->m[ 8]; Out->m[ 9] += In->m[ 9]; Out->m[10] += In->m[10]; Out->m[11] += In->m[11]; Out->m[12] += In->m[12]; Out->m[13] += In->m[13]; Out->m[14] += In->m[14]; Out->m[15] += In->m[15]; #endif } void SIMDx86Matrix_SumOf(SIMDx86Matrix* Out, const SIMDx86Matrix* In1, const SIMDx86Matrix* In2) { #if defined(USE_SSE) asm( "movups (%0), %%xmm0\n" "movups 16(%0), %%xmm1\n" "movups 32(%0), %%xmm2\n" "movups 48(%0), %%xmm3\n" "movups (%1), %%xmm4\n" "movups 16(%1), %%xmm5\n" "movups 32(%1), %%xmm6\n" "movups 48(%1), %%xmm7\n" "addps %%xmm0, %%xmm4\n" "addps %%xmm1, %%xmm5\n" "addps %%xmm2, %%xmm6\n" "addps %%xmm3, %%xmm7\n" "movups %%xmm4, (%2)\n" "movups %%xmm5, 16(%2)\n" "movups %%xmm6, 32(%2)\n" "movups %%xmm7, 48(%2)\n" : : "r" (In1), "r" (In2), "r" (Out) ); #elif defined(USE_3DNOW) asm( /* Get matrix */ "movq (%0), %%mm0\n" "movq 8(%0), %%mm1\n" "movq 16(%0), %%mm2\n" "movq 24(%0), %%mm3\n" "movq 32(%0), %%mm4\n" "movq 40(%0), %%mm5\n" "movq 48(%0), %%mm6\n" "movq 56(%0), %%mm7\n" /* Add with other */ "pfadd (%1), %%mm0\n" "pfadd 8(%1), %%mm1\n" "pfadd 16(%1), %%mm2\n" "pfadd 24(%1), %%mm3\n" "pfadd 32(%1), %%mm4\n" "pfadd 40(%1), %%mm5\n" "pfadd 48(%1), %%mm6\n" "pfadd 56(%1), %%mm7\n" /* Write out results */ "movq %%mm0, (%2)\n" "movq %%mm1, 8(%2)\n" "movq %%mm2, 16(%2)\n" "movq %%mm3, 24(%2)\n" "movq %%mm4, 32(%2)\n" "movq %%mm5, 40(%2)\n" "movq %%mm6, 48(%2)\n" "movq %%mm7, 56(%2)\n" : : "r" (In1), "r" (In2), "r" (Out) ); /* Execute 'femms' if desired */ #ifndef NO_EMMS asm("femms\n"); #endif #else Out->m[ 0] = In1->m[ 0] + In2->m[ 0]; Out->m[ 1] = In1->m[ 1] + In2->m[ 1]; Out->m[ 2] = In1->m[ 2] + In2->m[ 2]; Out->m[ 3] = In1->m[ 3] + In2->m[ 3]; Out->m[ 4] = In1->m[ 4] + In2->m[ 4]; Out->m[ 5] = In1->m[ 5] + In2->m[ 5]; Out->m[ 6] = In1->m[ 6] + In2->m[ 6]; Out->m[ 7] = In1->m[ 7] + In2->m[ 7]; Out->m[ 8] = In1->m[ 8] + In2->m[ 8]; Out->m[ 9] = In1->m[ 9] + In2->m[ 9]; Out->m[10] = In1->m[10] + In2->m[10]; Out->m[11] = In1->m[11] + In2->m[11]; Out->m[12] = In1->m[12] + In2->m[12]; Out->m[13] = In1->m[13] + In2->m[13]; Out->m[14] = In1->m[14] + In2->m[14]; Out->m[15] = In1->m[15] + In2->m[15]; #endif } void SIMDx86Matrix_Diff(SIMDx86Matrix* Out, const SIMDx86Matrix* In) { #if defined(USE_SSE) asm( "movups (%0), %%xmm0\n" "movups 16(%0), %%xmm1\n" "movups 32(%0), %%xmm2\n" "movups 48(%0), %%xmm3\n" "movups (%1), %%xmm4\n" "movups 16(%1), %%xmm5\n" "movups 32(%1), %%xmm6\n" "movups 48(%1), %%xmm7\n" "subps %%xmm4, %%xmm0\n" "subps %%xmm5, %%xmm1\n" "subps %%xmm6, %%xmm2\n" "subps %%xmm7, %%xmm3\n" "movups %%xmm0, (%0)\n" "movups %%xmm1, 16(%0)\n" "movups %%xmm2, 32(%0)\n" "movups %%xmm3, 48(%0)\n" : : "r" (Out), "r" (In) ); #elif defined(USE_3DNOW) asm( "movq (%0), %%mm0\n" "movq 8(%0), %%mm1\n" "movq 16(%0), %%mm2\n" "movq 24(%0), %%mm3\n" "movq 32(%0), %%mm4\n" "movq 40(%0), %%mm5\n" "movq 48(%0), %%mm6\n" "movq 56(%0), %%mm7\n" "pfsub (%1), %%mm0\n" "pfsub 8(%1), %%mm1\n" "pfsub 16(%1), %%mm2\n" "pfsub 24(%1), %%mm3\n" "pfsub 32(%1), %%mm4\n" "pfsub 40(%1), %%mm5\n" "pfsub 48(%1), %%mm6\n" "pfsub 56(%1), %%mm7\n" "movq %%mm0, (%0)\n" "movq %%mm1, 8(%0)\n" "movq %%mm2, 16(%0)\n" "movq %%mm3, 24(%0)\n" "movq %%mm4, 32(%0)\n" "movq %%mm5, 40(%0)\n" "movq %%mm6, 48(%0)\n" "movq %%mm7, 56(%0)\n" : : "r" (Out), "r" (In) ); /* Execute 'femms' if desired */ #ifndef NO_EMMS asm("femms\n"); #endif #else Out->m[ 0] -= In->m[0]; Out->m[ 1] -= In->m[1]; Out->m[ 2] -= In->m[2]; Out->m[ 3] -= In->m[3]; Out->m[ 4] -= In->m[4]; Out->m[ 5] -= In->m[5]; Out->m[ 6] -= In->m[6]; Out->m[ 7] -= In->m[7]; Out->m[ 8] -= In->m[8]; Out->m[ 9] -= In->m[9]; Out->m[10] -= In->m[10]; Out->m[11] -= In->m[11]; Out->m[12] -= In->m[12]; Out->m[13] -= In->m[13]; Out->m[14] -= In->m[14]; Out->m[15] -= In->m[15]; #endif } void SIMDx86Matrix_DiffOf(SIMDx86Matrix* Out, const SIMDx86Matrix* In1, const SIMDx86Matrix* In2) { #if defined(USE_SSE) asm( "movups (%0), %%xmm0\n" "movups 16(%0), %%xmm1\n" "movups 32(%0), %%xmm2\n" "movups 48(%0), %%xmm3\n" "movups (%1), %%xmm4\n" "movups 16(%1), %%xmm5\n" "movups 32(%1), %%xmm6\n" "movups 48(%1), %%xmm7\n" "subps %%xmm4, %%xmm0\n" "subps %%xmm5, %%xmm1\n" "subps %%xmm6, %%xmm2\n" "subps %%xmm7, %%xmm3\n" "movups %%xmm0, (%2)\n" "movups %%xmm1, 16(%2)\n" "movups %%xmm2, 32(%2)\n" "movups %%xmm3, 48(%2)\n" : : "r" (In1), "r" (In2), "r" (Out) ); #elif defined(USE_3DNOW) asm( /* Get 'In1'*/ "movq (%0), %%mm0\n" "movq 8(%0), %%mm1\n" "movq 16(%0), %%mm2\n" "movq 24(%0), %%mm3\n" "movq 32(%0), %%mm4\n" "movq 40(%0), %%mm5\n" "movq 48(%0), %%mm6\n" "movq 56(%0), %%mm7\n" /* Subtract 'In2' */ "pfsub (%1), %%mm0\n" "pfsub 8(%1), %%mm1\n" "pfsub 16(%1), %%mm2\n" "pfsub 24(%1), %%mm3\n" "pfsub 32(%1), %%mm4\n" "pfsub 40(%1), %%mm5\n" "pfsub 48(%1), %%mm6\n" "pfsub 56(%1), %%mm7\n" /* Store in 'Out' */ "movq %%mm0, (%2)\n" "movq %%mm1, 8(%2)\n" "movq %%mm2, 16(%2)\n" "movq %%mm3, 24(%2)\n" "movq %%mm4, 32(%2)\n" "movq %%mm5, 40(%2)\n" "movq %%mm6, 48(%2)\n" "movq %%mm7, 56(%2)\n" : : "r" (In1), "r" (In2), "r" (Out) ); /* Execute 'femms' if desired */ #ifndef NO_EMMS asm("femms\n"); #endif #else Out->m[ 0] = In1->m[0] - In2->m[0]; Out->m[ 1] = In1->m[1] - In2->m[1]; Out->m[ 2] = In1->m[2] - In2->m[2]; Out->m[ 3] = In1->m[3] - In2->m[3]; Out->m[ 4] = In1->m[4] - In2->m[4]; Out->m[ 5] = In1->m[5] - In2->m[5]; Out->m[ 6] = In1->m[6] - In2->m[6]; Out->m[ 7] = In1->m[7] - In2->m[7]; Out->m[ 8] = In1->m[8] - In2->m[8]; Out->m[ 9] = In1->m[9] - In2->m[9]; Out->m[10] = In1->m[10] - In2->m[10]; Out->m[11] = In1->m[11] - In2->m[11]; Out->m[12] = In1->m[12] - In2->m[12]; Out->m[13] = In1->m[13] - In2->m[13]; Out->m[14] = In1->m[14] - In2->m[14]; Out->m[15] = In1->m[15] - In2->m[15]; #endif } void SIMDx86Matrix_Scale(SIMDx86Matrix* mtx, float scalar) { #if defined(USE_SSE) asm( /* Store scalar in xmm4.x */ "movss %1, %%xmm4\n" /* Get the matrix into registers */ "movups (%0), %%xmm0\n" "movups 16(%0), %%xmm1\n" "movups 32(%0), %%xmm2\n" "movups 48(%0), %%xmm3
评论
    相关推荐
    • simd.zip
      哈希3候选算法之一,在第一轮中被淘汰,但仍然有许多区块链产品使用该算法,x11,x15等都用到simd
    • floki:simd算法
      一些 SIMD 算法的研究级实现。 访问对齐排序 基于此介绍的算法的实现 原在这里。 示例用法 std::vector< int32> values = { 0 , 4 , 6 , 20 , 40 , 60 , 90 , 155 , 1188 , 2002 , 2244 , 2296 , 3124 , 3226 , ...
    • SIMD.jl:Julia 的显式 SIMD 向量运算
      SIMD Julia 中的显式 SIMD 矢量化 Julia CI v1 每晚 概述 这个包允许程序员显式地对他们的 Julia 代码进行 SIMD 向量化。 理想情况下,编译器(Julia 和 LLVM)能够自动执行此操作,尤其是对于直接编写的代码。 ...
    • thermite:铝热SIMD
      Thermite SIMD:融化您的CPU 注意:此板条箱尚未在crates.io上,但我确实拥有该名称,并将在准备好后将其发布在该板条上 Thermite是一个WIP SIMD库,致力于使用一致长度的1 SIMD向量进行锁步迭代和计算,从而提供SoA...
    • simd:ghc的simd矢量支持的简单界面
      simd 该库为GHC 7.8中提供的SIMD primop提供了一个简单的接口。 SIMD(单指令多数据)CPU指令提供了一种并行化数值计算的简便方法。 GHC 7.8提供了primops,使我们可以访问这些CPU指令。 该软件包将primo封装为更加...
    • simdeez:易simd
      一个在SIMD指令集(包括宽度不同的指令集)上抽象的库。 SIMDeez旨在允许您一次编写一个函数并生成该函数的SSE2,SSE41和AVX2版本。 您可以在编译时选择想要的版本,也可以在运行时自动选择。 如果您需要一些当前...
    • hw-json-simd
      硬件json-simd 该库/工具将根据以下文章在JSON文件上生成半索引:。 命令行工具 对于给定的JSON文件, hw-json-simd将生成两个半索引文件,这两个半索引文件可以一起加载到单个内存中半索引中。 可以使用两种方法...
    • faster:人类SIMD
      人类SIMD 简单,强大,便携,荒谬的快速数值计算。 包括基于平台和向量类型的静态分配和内联,零分配迭代,向量化的加载/存储以及对不均匀收集的支持。 看起来像这样: use faster :: * ; let lots_of_3s = ( & ...
    • pik_simd:googlepik独立simd
      高效便携式SIMD包装器 该库在现有的特定于平台的内部函数上提供类型安全和源代码可移植包装器。 其设计旨在简化,提高效率并立即使用当前编译器。 当前状态 为标量/ SSE4 / AVX2 / ARMv8目标实现,每个目标都有单元...
    • SIMD-test:探索SIMD优化
      SIMD测试 结果:启用-O3时,gcc和clang都可以执行简单的SIMD优化。 没有探索更困难的SIMD优化问题。 test-gcc-debug sum: 99897982687.000000 time: 0.446810 test-gcc-o3 sum: 99897982687.000000 time: 0.157358 ...