Tag: icc

ICC是否满足复数的乘法C99规范?

考虑这个简单的代码: #include complex float f(complex float x) { return x*x; } 如果使用英特尔编译器使用-O3 -march=core-avx2 -fp-model strict进行编译,则可以得到: f: vmovsldup xmm1, xmm0 #3.12 vmovshdup xmm2, xmm0 #3.12 vshufps xmm3, xmm0, xmm0, 177 #3.12 vmulps xmm4, xmm1, xmm0 #3.12 vmulps xmm5, xmm2, xmm3 #3.12 vaddsubps xmm0, xmm4, xmm5 #3.12 ret 这比你从gcc和clang获得的代码简单得多,而且比你在网上找到的用于乘以复数的代码简单得多。 例如,它没有明确地用于处理复杂的NaN或无穷大。 这个组件是否符合C99复数乘法的规范?

如何强制OpenMPI使用GCC而不是ICC? 是否需要重新编译OpenMPI?

我有一个为gcc编写的并行计算的C代码,我想在一个集群上编译它,显然它通过mpicc使用icc 。 将代码更改为icc友好似乎对时间要求太高,所以我想知道我是否可以要求OpenMPI使用gcc代替。 我没有该群集的管理员权限,我实际上更愿意不弄乱原始配置。 如果无法在例如Makefile设置,那么我希望在我的主目录中编译OpenMPI ,但是我需要一些指导,然后必须做什么。 你可以帮帮我吗? UPDATE1 Makefile包含 CC = mpicc CFLAGS += -DMPI 这里有一些OpenMPI文件 $ which mpicc /usr/bin/mpicc lrwxr-xr-x /usr/bin/mpicc -> opal_wrapper -rwxr-xr-x /usr/bin/opal_wrapper 如果我能为您提供更多信息,请告诉我。 UPDATE2 在Jeff的帮助下 ,我能够找到mpicc OpenMPI设置 $ more /usr/local/share/openmpi/mpicc-wrapper-data.txt project=Open MPI project_short=OMPI version=1.1.4 language=C compiler_env=CC compiler_flags_env=CFLAGS compiler=icc extra_includes= openmpi preprocessor_flags= compiler_flags=-pthread linker_flags= libs=-lmpi -lorte -lopal -ldl -Wl,–export-dynamic -lnsl -lutil -ldl […]

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

我试图在一段代码上实现SSE矢量化,我需要将我的1D数组与16字节内存对齐。 但是,我已经尝试了几种方法来分配16byte内存对齐数据,但它最终是4byte内存对齐。 我必须使用Intel icc编译器。 这是我正在测试的示例代码: #include #include 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; } 这是我得到的输出: &A[0] = […]

缺少面具的AVX-512内在函数?

英特尔的内在指南列出了 AVX-512 K *掩码指令的一些内在函数 ,但似乎有一些缺失: KSHIFT {L / R} KADD KTEST 英特尔开发人员手册声称内在函数不是必需的,因为它们是由编译器自动生成的。 一个人怎么做呢? 如果这意味着__mmask *类型可以被视为常规整数,那么它会很有意义,但是像mask << 4这样的测试似乎会导致编译器将掩码移动到常规寄存器,移动它,然后再移回到面具。 这是使用Godbolt最新的GCC和ICC -O2 -mavx512bw 。 另外有趣的是,内在函数只处理__mmask16而不是其他类型。 我没有测试太多,但看起来ICC并不介意采用不正确的类型,但GCC似乎确实尝试确保掩码中只有16位,如果你使用内在函数。 我是不是在寻找上述指令的正确内在函数,以及其他__mmask *类型变体,还是有其他方法可以实现相同的东西而不需要求助于内联汇编?