Tag: 矢量化

使这个C数组处理代码更加python(甚至numpy)

我试图了解python的惊人列表处理能力(最终是numpy)。 我正在转换我编写的一些C代码到python。 我有一个文本数据文件,其中第一行是标题,然后每个奇数行是我的输入数据,每个偶数行是我的输出数据。 所有数据空间分开。 我很高兴能够使用嵌套列表推导将所有数据读入列表。 太棒了。 with open(‘data.txt’, ‘r’) as f: # get all lines as a list of strings lines = list(f) # convert header row to list of ints and get info header = map(int, lines[0].split(‘ ‘)) num_samples = header[0] input_dim = header[1] output_dim = header[2] del header # bad ass list comprehensions […]

在`C`函数中定义`static const` SIMD变量

我有这种forms的函数(使用SSE从指数函数的最快实现 ): __m128 FastExpSse(__m128 x) { static __m128 const a = _mm_set1_ps(12102203.2f); // (1 << 23) / ln(2) static __m128i const b = _mm_set1_epi32(127 * (1 << 23) – 486411); static __m128 const m87 = _mm_set1_ps(-87); // fast exponential function, x should be in [-87, 87] __m128 mask = _mm_cmpge_ps(x, m87); __m128i tmp = _mm_add_epi32(_mm_cvtps_epi32(_mm_mul_ps(a, […]

GCC C向量扩展:如何将向量的内容向左移动一个元素?

我是GCC的C矢量扩展的新手。 我正在考虑在我的项目中使用它们,但它们的实用性(在某种程度上)取决于能够有效地将向量中的所有元素向左移动一个位置并将结果存储在新向量中。 如何有效地完成这项工作(例如以SIMD加速方式)? 所以,基本上: OriginalVector = {1,2,3,4,5,6,7,8} ShiftedVector = {2,3,4,5,6,7,8,X}(其中X可以是任何东西。) 背景信息(你可以跳过这个):这种转换的目的是处理矩阵,其中每一行用向量表示。 具体来说,它可以使ShiftedVector视为下方行的左上对角线,并比较一个SIMD操作中的所有值。 如果有另一种方法将矢量与另一个矢量偏移一个元素进行比较,那么这也可以解决问题。 但我假设没有,并且执行此比较的最有效方法是向左移动所有元素并以1:1进行比较。 一般规定: 在此过程中不得损害原始载体 如果我必须使用某种类型的x86内部函数 ,这很好,但我不知道是哪种或如何 如果我丢失了向量中最左边的元素并且在最右边引入了乱码,这很好 如果最有效的方法是从第二个位置到结束+ 1的原始矢量的未对齐加载,那很好,但我仍然想知道如何最好地编码这个 这里的瓶颈似乎是缺乏关于使用内在函数的过程的一般信息。 似乎人们使用汇编(我不是专家)或自动矢量化( 这里不能很好地工作 ),因此矢量类型是最合乎逻辑的选择。 谢谢!

有没有办法显示LLVM自动矢量化的位置?

上下文:我在Objective-C库中有几个循环,它处理大型文本数组。 我现在可以看到它以单线程方式运行。 据我所知,LLVM现在能够自动矢量化循环,如Apple在WWDC会议上所述。 然而,它的方式非常谨慎,其中一个原因是由于CPU流水线操作而导致变量被修改的可能性。 我的问题:我怎样才能看到LLVM在哪里对我的代码进行了矢量化,更有用的是,我如何才能收到解释为什么它无法对我的代码进行矢量化的调试消息? 我敢肯定,如果它能看出为什么它不能自动矢量化它,它可以指出我,我可以进行必要的手动调整,使其可以矢量化。 如果我没有指出这个问题已经或多或少已经被问过,而且非常迟钝,我会在这里失职。

C中的矢量化Trigfunction?

我正在寻找计算高度并行化的trig函数(在1024的块中),并且我想利用至少一些现代架构所具有的并行性。 当我编译一个块 for(int i=0; i<SIZE; i++) { arr[i]=sin((float)i/1024); } 海湾合作委员会不会对其进行矢量化,并表示 not vectorized: relevant stmt not supported: D.3068_39 = __builtin_sinf (D.3069_38); 这对我来说很有意义。 但是,我想知道是否有一个库可以进行并行三角计算。 只有一个简单的泰勒系列上升到11阶,GCC将矢量化所有循环,并且我的速度超过了一个天真的sin循环的速度的两倍(具有精确的答案,或者具有9阶系列,只有一个位)关闭1600个值的最后两个,加速> 3倍)。 我确定有人之前遇到过这样的问题,但是当我谷歌时,我发现没有提到任何库等。 A.是否已存在某些内容? B.如果没有,建议优化并行触发function? 编辑:我发现了以下库名为“SLEEF”: http ://shibatch.sourceforge.net/,在本文中描述并使用SIMD指令计算几个基本function。 它使用SSE和AVX特定代码,但我认为将其转换为标准C循环并不困难。

矢量化是什么意思?

向量化代码是一个好主意吗? 在什么时候这样做有什么好的做法? 下面会发生什么?

具有数据依赖性的for循环矢量化

我有基于BiCCG(共轭梯度)的矩阵求解器的实现,它也考虑了周期性。 碰巧的情况是,实现是计算密集型的,并且由于依赖性问题,循环不会自动向量化。 我进行了一些探索,似乎红黑高斯seidel算法比vanilla版本(也有类似的依赖性问题)更有效并行化。 可以更改此循环/算法,以便可以有效地进行矢量化吗? // FORWARD #pragma omp for schedule(static, nx/NTt) for (i=1; i<=nx; i++) for (j=1; j<=ny; j++) for (k=1; k<=nz; k++) { dummy = res_sparse_s[i][j][k]; dummy -= COEFF[i][j][k][7] * RLL[i-1][j][k]; if (PeriodicBoundaryX && i==nx)dummy -= COEFF[i][j][k][8] * RLL[1 ][j][k]; dummy -= COEFF[i][j][k][2] * RLL[i][j-1][k]; if (PeriodicBoundaryY && j==ny) dummy -= COEFF[i][j][k][3] * RLL[i][1 […]

数学’pow’函数gcc的SSE向量化

我试图对包含在数学库中使用’pow’函数的循环进行矢量化。 我知道英特尔编译器支持使用’pow’作为sse指令 – 但我似乎无法使用gcc运行(我认为)。 这是我正在使用的情况: int main(){ int i=0; float a[256], b[256]; float x= 2.3; for (i =0 ; i<256; i++){ a[i]=1.5; } for (i=0; i<256; i++){ b[i]=pow(a[i],x); } for (i=0; i<256; i++){ b[i]=a[i]*a[i]; } return 0; } 我正在编译以下内容: gcc -O3 -Wall -ftree-vectorize -msse2 -ftree-vectorizer-verbose=5 code.c -o runthis 这是在使用gcc版本4.2的os X 10.5.8上(我也使用了4.5,并且无法判断它是否已经向量化了 – 因为它根本没有输出任何内容)。 似乎没有一个循环矢量化 – […]

使用SSE内在函数进行优化

我试图将一个循环转换为SSE内在函数。 我似乎已经取得了相当不错的进展,而且我的意思是它是在正确的方向但是我似乎在某处做了一些错误的翻译,因为我没有得到非sse代码导致的相同的“正确”答案。 我以4倍展开的原始循环如下所示: int unroll_n = (N/4)*4; for (int j = 0; j < unroll_n; j++) { for (int i = 0; i < unroll_n; i+=4) { float rx = x[j] – x[i]; float ry = y[j] – y[i]; float rz = z[j] – z[i]; float r2 = rx*rx + ry*ry + rz*rz + eps; […]

使用OpenMP停止GCC自动矢量化

我一直在努力使我的代码能够被GCC自动矢量化,但是,当我包含-fopenmp标志时,它似乎停止了所有自动矢量化的尝试。 我正在使用ftree-vectorize -ftree-vectorizer-verbose=5进行矢量化和监控。 如果我不包含该标志,它会开始向我提供有关每个循环的大量信息,如果它是矢量化的,为什么不。 当我尝试使用omp_get_wtime()函数时,编译器停止,因为它无法链接。 一旦包含了标志,它就会简单地列出每个函数并告诉我它中的向量化0循环。 我已经阅读了其他一些地方已经提到这个问题,但他们并没有真正找到任何解决方案: http://software.intel.com/en-us/forums/topic/295858 http:// gcc。 gnu.org/bugzilla/show_bug.cgi?id=46032 。 OpenMP有自己的处理矢量化的方法吗? 我需要明确告诉它吗?