Tag: icc

为什么ICC在x86上的汇编中产生“inc”而不是“add”?

在摆弄简单的C代码的同时,我发现了一些奇怪的东西。 为什么ICC在为增量生成的汇编代码中生成incl %eax而不是addl $1, %eax ? GCC的行为与预期的一样,使用add 。 示例代码(GCC和ICC上使用的-O3 ) int A, B, C, D, E; void foo() { A = B + 1; B = 0; C++; D++; D++; E += 2; } ICC的结果 L__routine_start_foo_0: foo: movl B(%rip), %eax #5.13 movl D(%rip), %edx #8.9 incl %eax #5.17 movl E(%rip), %ecx #10.9 addl $2, %edx […]

带有icc的OpenMP和线程本地存储标识符

这是一个简单的测试代码: #include __thread int a = 0; int main() { #pragma omp parallel default(none) { a = 1; } return 0; } gcc编译这个没有任何问题-fopenmp ,但icc (ICC) 12.0.2 20110112与-openmp抱怨 test.c(7):错误:必须在包含OpenMP并行编译指示的变量列表中指定“a”#pragma omp parallel default(none) 我不知道哪种范式(即shared , private , threadprivate )适用于这种类型的变量。 哪一个是正确使用的? 我在调用访问该线程局部变量的函数时得到了预期的行为,但是我在显式并行部分中访问它时遇到了麻烦。 编辑: 到目前为止,我最好的解决方案是通过函数返回指向变量的指针 static inline int * get_a() { return &a; }

从icc获取Intel-syntax asm输出,而不是默认的AT&T语法?

我遇到了问题。 我一直在使用gcc来编译/汇编我的C代码一段时间,并习惯于阅读英特尔汇编语法。 我在生成程序集文件时使用了-masm=intel标志。 然而最近,由于公司迁移,他们获得了英特尔的icc,声称它更好。 所以现在我需要使用icc,但奇怪的是它有默认的汇编语法为AT&T。 我试图改变它,但它没有用,所以我联系了英特尔支持,他们也不知道,每个人都给了我一个矛盾的答案。 有没有办法集成gcc和icc,以便我使用icc编译“优势”,同时用gcc编译intel的语法? 我正在使用ubuntu并获得了icc版本12.x.

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

我第一次使用SSE内在函数,即使确保了16byte内存对齐,我也遇到了分段错误。 这篇文章是我之前问题的扩展: 如何分配16byte内存对齐数据 这是我声明我的数组的方式: float *V = (float*) memalign(16,dx*sizeof(float)); 当我尝试这样做时: __m128 v_i = _mm_load_ps(&V[i]); //It works 但是当我这样做时: __m128 u1 = _mm_load_ps(&V[(i-1)]); //There is a segmentation fault 但如果我这样做: __m128 u1 = _mm_loadu_ps(&V[(i-1)]); //It works again 但是我想消除使用_mm_loadu_ps并希望仅使用_mm_load_ps使其工作。 我正在使用Intel icc编译器。 我该如何解决这个问题? 更新: 使用以下代码中的两个操作: void FDTD_base (float *V, float *U, int dx, float c0, float c1, float c2, float […]

ISO 8601:2004中的C预处理器__TIMESTAMP__

如何在ISO 8601:2004中更换__TIMESTAMP__ ? __TIMESTAMP__ Sat Jul 6 02:50:06 2013 VS __TIMESTAMP_ISO__ 2013-07-06T00:50:06Z

为什么icc无法以合理的方式处理编译时分支提示?

开发人员可以使用__builtin_expect 内置来帮助编译器了解分支可能走向哪个方向。 在将来,我们可能会为此目的获得一个标准属性 ,但截至今天,至少所有clang , icc和gcc支持非标准的__builtin_expect 。 但是,当你使用它时, icc似乎会生成奇怪的代码1 。 也就是说,无论使用哪个方向进行预测,使用内置函数的代码都严格地比没有内置代码的代码更糟糕。 以下面的玩具function为例: int foo(int a, int b) { do { a *= 77; } while (b– > 0); return a * 77; } 在三个编译器中, icc是唯一一个将其编译为3个指令的最佳标量循环的编译器: foo(int, int): ..B1.2: # Preds ..B1.2 ..B1.1 imul edi, edi, 77 #4.6 dec esi #5.12 jns ..B1.2 # Prob 82% […]

C编译器中的列主要数组存储

是否有任何C编译器具有扩展以按列主要顺序存储数组而不是标准行主要顺序?

当main.c不使用pthreads时,为什么必须在main.c编译中显式链接到pthreads?

在Linux中,我有一个使用pthreads的共享库和没有的。 libpthread.so显示在我的共享库的ldd中,这是正确的。 $ ldd libmapreduce.so.1.0 linux-gate.so.1 => (0x0067d000) libpthread.so.0 => /lib/libpthread.so.0 (0x0058c000) […] 但是当我编译并链接不使用pthreads的main.c到我的共享库时,我看到: $ icc -Wall -o main main.c -lmapreduce /opt/intel/Compiler/11.1/046/lib/ia32/libiomp5.so: undefined reference to `pthread_atfork’ 将-lpthread添加到我的编译命令,即 $ icc -Wall -o main main.c -lmapreduce -lpthread 解析未定义的引用。 当我的main.c不使用它并且我的共享库已经链接了libpthread时,为什么我需要显式链接到libpthread?

支持英特尔C编译器中的+, – ,*,/和%的128位整数?

GCC和Clang具有__int128_t和__uint128_t扩展,用于128位整数运算。 我希望 __m128i可以为英特尔C编译器提供类似的东西,但是(如果它甚至可能)它看起来像我必须编写显式SSE2函数调用才能使用__m128i ,而不是使用“内置” “ + , – , * , /和%等运营商。 我希望做这样的事情(这不起作用): #if defined(__INTEL_COMPILER) && defined(__SSE2__) #include “xmmintrin.h” typedef __u128 uint128_t; #elif defined (__GNUC__) typedef __uint128_t uint128_t; #else #error For 128-bit arithmetic we need GCC or ICC, or uint128_t #endif 是否有128位整数支持运算符+ , – , * , /和%埋藏在icc中?

当非const参数作为const参数传递时,Intel C ++ Compiler警告167

我有一个很大的代码库,最近从Microsoft的编译器转移到了英特尔C ++编译器。 我们团队的目标是在主线上编辑而不发出警告。 自开关以来,警告167的一个实例让我感到困惑。 如果我编译以下代码: int foo(const int pp_stuff[2][2]) { return 0; } int foo2(const int pp_stuff[][2]) { return 0; } int main(void) { int stuff[2][2] = {{1,2},{3,4}}; foo(stuff); foo2(stuff); return 0; } 国际刑事法院会给我警告: 1>main.c(17): warning #167: argument of type “int (*)[2]” is incompatible with parameter of type “const int (*)[2]” 1> foo(stuff); 1> ^ […]