小编Mar*_*tin的帖子

为什么gcc autovectorization对3x3的卷积矩阵不起作用?

我已经为卷积矩阵实现了以下程序

#include <stdio.h>
#include <time.h>

#define NUM_LOOP 1000
#define N 128   //input or output dimention 1
#define M N     //input or output dimention 2
#define P 5 //convolution matrix dimention 1 if you want a 3x3 convolution matrix it must be 3
#define Q P     //convolution matrix dimention 2
#define Csize P*Q   
#define Cdiv  1     //div for filter 
#define Coffset 0   //offset 

//functions
void unusual(); //unusual implementation of convolution
void naive();
//data
unsigned short int input[N][M] __attribute__(( aligned(32))); // input …
Run Code Online (Sandbox Code Playgroud)

c x86 gcc compiler-optimization auto-vectorization

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

如何使用AVX2有效地连接两个向量?(VPALIGNR的交叉版本)

我已经实现了内联函数(_mm256_concat_epi16).它连接两个包含16位值的AVX2向量.它适用于前8个数字.如果我想将它用于向量的其余部分,我应该更改实现.但是在我的主程序中使用单个内联函数会更好.

问题是:有没有比我的更好的解决方案或任何建议使这个内联函数更通用,它适用于16个值而不是我的解决方案适用于8个值?我的解决方案连接2个向量,但只解决了16个可能状态的8个状态.

**编辑*我对这个问题的当前解决方案是使用未对齐的加载函数,它可以从内存中的任何部分读取.但是,当数据在寄存器中准备就绪时,重用它可能会更好.但是,它可能会导致端口5出现瓶颈,导致混乱,置换等.但吞吐量可能已足够(尚未测试).

#include <stdio.h>
#include <x86intrin.h>

inline _mm256_print_epi16(__m256i a, char* name){
    short temp[16], i;
    _mm256_storeu_si256((__m256i *) &temp[0], a);
    for(i=0; i<16; i++)
        printf("%s[%d]=%4d , ",name,i+1,temp[i]);
    printf("\n");
}

inline __m256i _mm256_concat_epi16(__m256i a, __m256i  b, const int indx){
    return _mm256_alignr_epi8(_mm256_permute2x128_si256(a,b,0x21),a,indx*2);
}

int main()
{
    __m256i a = _mm256_setr_epi16(101,102,103,104,105,106,107,108,109,1010,1011,1012,1013,1014,1015,1016);_mm256_print_epi16(a, "a");
    __m256i b = _mm256_setr_epi16(201,202,203,204,205,206,207,208,209,2010,2011,2012,2013,2014,2015,2016);_mm256_print_epi16(b, "b");

    _mm256_print_epi16(_mm256_concat_epi16(a,b,8), "c");//numbers: 0-8
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

出局是:

// icc  -march=native -O3 -D _GNU_SOURCE -o "concat" "concat.c"
[fedora@localhost concatination]$ "./concat"
a[1]= 101 …
Run Code Online (Sandbox Code Playgroud)

c simd intrinsics avx avx2

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

混合EVEX和VEX编码方案的代价是什么?

这是一个已知的问题是混合VEX编码的指令和非VEX指令有一个点球和程序员必须意识到这一点.

有一些像这样的问题和答案.解决方案取决于您编程的方式(通常您应该zeroupper在转换后使用.但我的问题是关于EVEX编码的方案.只要没有内在函数,例如_mm512_zeroupper()使用VEX编码和EVEX-时似乎没有惩罚但是,EVEX是4字节,VEX是3字节,矢量长度分别是512位和256位.

因为AVX-512不可用(至少对我而言).我想问一下,当我们想要混合它们时,有什么需要注意的.

x86 assembly simd avx512

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

如何同时使用omp parallel和omp simd?

我想测试#pragma omp parallel for#pragma omp simd一个简单的矩阵追加程序.当我单独使用它们时,我没有错误,看起来很好.但是,我想测试使用它们可以获得多少性能.如果我#pragma omp parallel for在外循环#pragma omp simd之前和内循环之前使用,我也没有错误.当我在外部循环之前使用它们时发生错误.我在运行时遇到错误而不是编译时间.ICCGCC返回错误,但Clang没有.这可能是因为Clang重新定位了并行化.在我的实验中,Clang没有并行化并只用一个线程运行程序.

该计划在这里:

#include <stdio.h>
//#include <x86intrin.h>
#define N 512
#define M N

int __attribute__(( aligned(32))) a[N][M],
    __attribute__(( aligned(32))) b[N][M],
    __attribute__(( aligned(32))) c_result[N][M];

int main()
{
    int i, j;
    #pragma omp parallel for
    #pragma omp simd
    for( i=0;i<N;i++){
        for(j=0;j<M;j++){
            c_result[i][j]= a[i][j] + b[i][j];
        }
    }

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

错误:ICC:

IMP1.c(20):错误:omp指令后面没有可并行化的for循环#pragma omp parallel for ^

IMP1.c的编译中止(代码2) …

c parallel-processing x86 simd openmp

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

AVX-512中的压缩和扩展指令有什么区别?

我正在研究英特尔内在指南中的扩展和压缩操作.我对这两个概念感到困惑:

对于 __m128d _mm_mask_expand_pd (__m128d src, __mmask8 k, __m128d a) == vexpandpd

从a(在掩码k中设置各自的位)加载连续的有效双精度(64位)浮点元素,并使用写掩码k将结果存储在dst中(当相应的掩码位为时,从src复制元素)没有设置).

对于 __m128d _mm_mask_compress_pd (__m128d src, __mmask8 k, __m128d a) == vcompresspd

将有效双精度(64位)浮点元素连续存储在a(在写掩码k中设置各自的位)到dst,并从src传递剩余的元素.

是否有更清楚的描述或任何可以解释更多的人?

提前致谢.

x86 assembly simd avx512

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

警告:发生了非法反射访问操作(java 中的便携式 opencv)

我想制作一个便携式opencv应用程序,将依赖项添加到 maven 文件中pom.xml

简化的代码是:

import org.opencv.core.Mat;

public class Builder {

    public static void main(String[] args) {

        nu.pattern.OpenCV.loadShared();
        System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME);

        Mat mat = new Mat(4,3,1);
        System.out.println(mat.dump());
    }
}
Run Code Online (Sandbox Code Playgroud)

我将此添加到pom.xml

<dependency>
      <groupId>org.openpnp</groupId>
      <artifactId>opencv</artifactId>
      <version>3.2.0-0</version>
      <scope>compile</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

它适用于 java 9 的以下警告:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by nu.pattern.OpenCV$SharedLoader (file:/home/martin/.m2/repository/org/openpnp/opencv/3.2.0-0/opencv-3.2.0-0.jar) to field java.lang.ClassLoader.usr_paths
WARNING: Please consider reporting this to the maintainers of nu.pattern.OpenCV$SharedLoader
WARNING: Use --illegal-access=warn to enable warnings of further …
Run Code Online (Sandbox Code Playgroud)

java opencv maven javacv java-9

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

如何在AVX/AVX2中增加矢量

我想使用内在函数来增加SIMD向量的元素.最简单的方法似乎是为每个元素添加1,如下所示:

(注意:vec_inc之前已经设置为1)

vec = _mm256_add_epi16 (vec, vec_inc);
Run Code Online (Sandbox Code Playgroud)

但是有没有增加矢量的特殊指令?就像inc这个网页?还是其他更简单的方法?

x86 assembly simd intrinsics avx2

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

在标量矩阵加法中使用 vaddss 代替 adds 有什么好处?

我已经实现了标量矩阵加法内核。

#include <stdio.h>
#include <time.h>
//#include <x86intrin.h>

//loops and iterations:
#define N 128
#define M N
#define NUM_LOOP 1000000


float   __attribute__(( aligned(32))) A[N][M],
        __attribute__(( aligned(32))) B[N][M],
        __attribute__(( aligned(32))) C[N][M];

int main()
{
int w=0, i, j;
struct timespec tStart, tEnd;//used to record the processiing time
double tTotal , tBest=10000;//minimum of toltal time will asign to the best time
do{
    clock_gettime(CLOCK_MONOTONIC,&tStart);

    for( i=0;i<N;i++){
        for(j=0;j<M;j++){
            C[i][j]= A[i][j] + B[i][j];
        }
    }

    clock_gettime(CLOCK_MONOTONIC,&tEnd);
    tTotal = (tEnd.tv_sec - tStart.tv_sec);
    tTotal += (tEnd.tv_nsec - tStart.tv_nsec) …
Run Code Online (Sandbox Code Playgroud)

x86 assembly gcc sse avx

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

如何使用C/java检测活动应用程序?

我想记录活动应用程序并保存活动应用程序的历史记录.我说活动应用程序,因为如果我运行一个应用程序并且它被最小化等,我不会将它视为活动应用程序.为了使我的问题更清楚,让我们来看看这个例子.我打开Firefox并在网上冲浪20分钟.然后我打开一个文本编辑器并开始写5分钟(Firefox正在运行,但我不使用它,因此Firefox不应被视为活动应用程序).所以我应该能够记录以下信息:

Firefox -> 20 minutes 
Text editor -> 5 minutes
Run Code Online (Sandbox Code Playgroud)

我希望在操作系统(首选Linux)期间跟踪每个使用过的应用程序,并创建一个开源应用程序,说明您使用每个应用程序的数量.

更新:我要记录的应用程序是用户在显示器上看到并正在使用的应用程序.例如,你可以改变窗口大小,你可以看到Firefox和文本编辑器(在不同的工作空间,级联等),但是你在文本编辑器中键入,因此,文本编辑器是积极的应用.换句话说,如果您正在与应用程序进行交互,或者是您正在查看的最后一个交互式应用程序,以PDF格式,文本等方式阅读某些内容,则应用程序处于活动状态.与应用程序交互:我的意思是单击,键入,滚动等.

NARROWING:我唯一不知道的是如何在这些条件下获得活动应用程序.我认为,如果我在当前工作区中的显示器上获得可以解决问题的最好的应用程序,那么我们有一个属性设置为窗口(总是在顶部),可能需要在没有启用此属性的情况下获取.我发现这个问题可能有助于回答.

使用Fedora 26,

提前致谢.

c java linux x11 operating-system

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

如何用整数变量划分__m256i向量?

我想将AVX2向量除以常数.我访问了这个问题和许多其他页面.看到可能有助于定点运算的东西,我不明白.所以问题在于这种划分是瓶颈.我试过两种方法:

首先,使用AVX指令进行浮动并执行操作:

//outside the bottleneck:
__m256i veci16; // containing some integer numbers (16x16-bit numbers)
__m256 div_v = _mm256_set1_ps(div);

//inside the bottlneck
//some calculations which make veci16
vecps = _mm256_castsi256_ps (veci16);
vecps = _mm256_div_ps (vecps, div_v);
veci16 = _mm256_castps_si256 (vecps);
_mm256_storeu_si256((__m256i *)&output[i][j], veci16);
Run Code Online (Sandbox Code Playgroud)

使用第一种方法,问题是:没有分割经过的时间是5ns,并且经过的时间是大约60ns.

其次,我存储到一个数组并加载它像这样:

int t[16] ;
inline __m256i _mm256_div_epi16 (__m256i a , int b){

    _mm256_store_si256((__m256i *)&t[0] , a);
    t[0]/=b; t[1]/=b; t[2]/=b; t[3]/=b; t[4]/=b; t[5]/=b; t[6]/=b; t[7]/=b;
    t[8]/=b; t[9]/=b; t[10]/=b; t[11]/=b; t[12]/=b; t[13]/=b; t[14]/=b; t[15]/=b;
    return …
Run Code Online (Sandbox Code Playgroud)

optimization x86 simd avx avx2

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