小编PGO*_*eGo的帖子

使用英特尔SSE内在函数优化代码进行矢量化

这是我第一次使用SSE内在函数.我试图将一段简单的代码转换为使用英特尔SSE内在的更快的版本(直到SSE4.2).我好像遇到了一些错误.

代码的标量版本是:(简单矩阵乘法)

     void mm(int n, double *A, double *B, double *C)
     {
        int i,j,k;
        double tmp;

        for(i = 0; i < n; i++)
            for(j = 0; j < n; j++) {
                    tmp = 0.0;
                    for(k = 0; k < n; k++)
                            tmp += A[n*i+k] *
                                   B[n*k+j];
                    C[n*i+j] = tmp;

              }
            }
Run Code Online (Sandbox Code Playgroud)

这是我的版本:我已经包含了 #include <ia32intrin.h>

      void mm_sse(int n, double *A, double *B, double *C)
      {
        int i,j,k;
        double tmp;
        __m128d a_i, b_i, c_i;

        for(i = 0; i < n; i++)
            for(j …
Run Code Online (Sandbox Code Playgroud)

c sse sse3 sse4

14
推荐指数
1
解决办法
6413
查看次数

如何分配16byte内存对齐数据

我试图在一段代码上实现SSE向量化,我需要将我的1D数组与16字节内存对齐.但是,我已经尝试了几种方法来分配16字节内存对齐数据,但它最终是4字节内存对齐.

我必须使用Intel icc编译器.这是我正在测试的示例代码:

  #include <stdio.h>
  #include <stdlib.h>

  void error(char *str)
  {
   printf("Error:%s\n",str);
   exit(-1);
  }

  int main()
  {
   int i;
   //float *A=NULL;
   float *A = (float*) memalign(16,20*sizeof(float));

   //align
   // if (posix_memalign((void **)&A, 16, 20*sizeof(void*)) != 0)
   //   error("Cannot align");

    for(i = 0; i < 20; i++)
       printf("&A[%d] = %p\n",i,&A[i]);

        free(A);

         return 0;
   }
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

 &A[0] = 0x11fe010
 &A[1] = 0x11fe014
 &A[2] = 0x11fe018
 &A[3] = 0x11fe01c
 &A[4] = 0x11fe020
 &A[5] = 0x11fe024
 &A[6] = 0x11fe028
 &A[7] = 0x11fe02c
 &A[8] = 0x11fe030 …
Run Code Online (Sandbox Code Playgroud)

c memory sse icc

12
推荐指数
2
解决办法
1万
查看次数

无法检测为什么下面的代码没有被矢量化

我一直在努力使用某个特定的应用程序,我已经尝试了一切.从自动向量化到手动编码的SSE内在函数.但不知何故,我无法在基于模板的应用程序上获得加速.

以下是我当前代码的片段,我使用SSE内在函数进行了矢量化.当我使用-vec-report3编译(Intel icc)时,我不断获取此消息:
remark:loop未向量化:语句无法向量化.

  #pragma ivdep
  for ( i = STENCIL; i < z - STENCIL; i+=4 )
  {
    it = it2 + i;

    __m128 tmp2i = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j4+k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j4+k*it_k])),X4_i); //loop was not vectorized: statement cannot be vectorized
    __m128 tmp3 = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j3+k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j3+k*it_k])),X3_i);
    __m128 tmp4 = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j2+k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j2+k*it_k])),X2_i);
    __m128 tmp5 = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j +k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j +k*it_k])),X1_i);

    __m128 tmp6 = _mm_add_ps(_mm_add_ps(_mm_add_ps(tmp2i,tmp3),_mm_add_ps(tmp4,tmp5)), _mm_mul_ps(_mm_load_ps(&p2[it]),C00_i));

    _mm_store_ps(&tmp2[i],tmp6);

   }
Run Code Online (Sandbox Code Playgroud)

我错过了一些关键的东西吗 由于该消息没有说明为什么它不能被矢量化,我发现很难确定瓶颈.

更新: 仔细考虑了建议后,我按照以下方式调整了代码.我认为最好将其进一步分解,以确定实际上导致向量依赖性的语句.

//#pragma ivdep
  for ( i = STENCIL; i < z - STENCIL; i+=4 )
  {
    it = it2 + …
Run Code Online (Sandbox Code Playgroud)

c sse vectorization icc stencils

11
推荐指数
1
解决办法
1209
查看次数

由于不正确的内存对齐,使用SSE内在函数时出现分段错误

我第一次使用SSE内在函数,即使在确保16byte内存对齐后,我也遇到了分段错误.这篇文章是我之前问题的扩展:

如何分配16byte内存对齐数据

这是我声明我的数组的方式:

  float *V = (float*) memalign(16,dx*sizeof(float));
Run Code Online (Sandbox Code Playgroud)

当我尝试这样做时:

  __m128 v_i = _mm_load_ps(&V[i]); //It works
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时:

  __m128 u1 = _mm_load_ps(&V[(i-1)]); //There is a segmentation fault
Run Code Online (Sandbox Code Playgroud)

但如果我这样做:

  __m128 u1 = _mm_loadu_ps(&V[(i-1)]); //It works again
Run Code Online (Sandbox Code Playgroud)

但是我想要消除使用_mm_loadu_ps并希望_mm_load_ps仅使用它.

我正在使用Intel icc编译器.

我该如何解决这个问题?

更新:

使用以下代码中的两个操作:

  void FDTD_base (float *V, float *U, int dx, float c0, float c1, float c2, float c3,     float c4)
    {
       int i, j, k;
                    for (i = 4; i < dx-4; i++)
                    {

                            U[i] = (c0 * (V[i]) …
Run Code Online (Sandbox Code Playgroud)

c memory sse icc

6
推荐指数
1
解决办法
3087
查看次数

基于C中4个索引的元组对数组进行排序

我有一个有趣的问题,过去两天我一直在努力解决这个问题.我试图在C中编写一个程序,它接受以下输入数组:

               1,1,5,5,
               1,1,5,9,
               2,2,6,2,
               1,2,5,5,
               1,3,6,6,
               1,4,5,1,
               4,1,5,6,
               5,2,7,1,
               1,1,6,0,
               2,2,5,0,
Run Code Online (Sandbox Code Playgroud)

step1:根据第3列对上面的数组进行分组(基于第3列的值,对4个元素(即每行)的元组进行桶排序:

               2,2,5,5
               1,1,5,9,
               1,2,5,5,
               1,4,5,1,
               4,1,5,6,
               2,2,5,0,
               2,2,6,2,
               1,3,6,6,
               1,1,6,0,
               5,2,7,1
Run Code Online (Sandbox Code Playgroud)

第2步:最后根据每个桶中的第4列对元素进行排序,如下所示:

最终输出数组:

              2,2,5,0,
              1,4,5,1,
              2,2,5,5,
              1,2,5,5,
              4,1,5,6,
              1,1,5,9,
              1,1,6,0,
              2,2,6,2,
              1,3,6,6,
              5,2,7,1
Run Code Online (Sandbox Code Playgroud)

第1列和第2列中的元素在上述排序过程中不起任何作用.

我尝试了各种技术,使用快速排序或桶排序,然后是后续的快速排序.没有什么事情做得很好.任何人都可以建议使用适当的数据结构在C中执行此操作的方法.

c sorting

1
推荐指数
1
解决办法
158
查看次数

使用strcpy时重复出现分段错误

获取以下代码的分段错误.请指教.

struct columns {
      char* c_name;
      char* c_type;
      char* c_size;
};

int main(int argc, char* argv[])
{
  int column_num = 3;
  struct columns col[10];
  //columns *col = (columns*) malloc (sizeof(columns) * column_num);
  strcpy(col[0].c_name, "PSID");
  strcpy(col[0].c_type, "INT");
  strcpy(col[0].c_size, "4");
}
Run Code Online (Sandbox Code Playgroud)

我使用2种方法为列结构分配空间,但继续得到分段错误.我错过了什么吗?

c c++ malloc segmentation-fault

0
推荐指数
1
解决办法
172
查看次数

在结构数组中访问std :: unordered_map时出现浮点错误

我的代码生成一个C数组结构,其中struct的一个成员是STL std :: unordered_map:

typedef struct test_s {
   int count_a;
   std::unordered_map<std::string, int> my_map;
} test_map;

typedef struct cm_example {
   int width;
   test_map *counts;
   unsigned int hasha, hashb;
} cm_sketch;
Run Code Online (Sandbox Code Playgroud)

但是当我尝试访问地图以执行查找,插入等时,我总是遇到浮点异常:

Compile:  g++ -std=c++11 -g test_struct.cpp -o h_str
Run:  ./h_str_str agggcctttgagag 100

Output: 
Kmer name: agggcctttgagag
hash_a: 172110908 , hash_b: 1954003865, bucket: 92 
Floating point exception
Run Code Online (Sandbox Code Playgroud)

我的代码如下:

cm_sketch *cm_init (int width, int seed)
{
    cm_sketch *cm;
    int i=0;

    cm = (cm_sketch *) malloc(sizeof(cm_sketch));
    cm->width = width;

    cm->counts = (test_map *) malloc …
Run Code Online (Sandbox Code Playgroud)

c++ struct stl unordered-map

0
推荐指数
1
解决办法
1026
查看次数