gpt4 book ai didi

c - ICC 选择报告 "subscript too complex"

转载 作者:太空宇宙 更新时间:2023-11-04 02:59:35 25 4
gpt4 key购买 nike

当我在 ICC 中使用 -opt-report 或 -vec-report 选项编译给定文件时,除其他外,我得到以下消息:

foo.c(226:7-226:7):VEC:function_foo:  loop was not vectorized: subscript too complex
foo.c(226): (col. 7) warning #13379: loop was not vectorized with "simd"
vectorization support: call to function absorbing_apply cannot be vectorized
loop was not vectorized: not inner loop
loop was not vectorized: unsupported loop structure
loop was not vectorized: subscript too complex

我知道这些消息的含义。让我担心的是,在 foo.c:226 中根本没有任何循环。其实就是调用了另外一个函数。该函数确实包含一些通过体积运行的循环,并且确实如 icc 报告的那样正确矢量化。但是,对该函数的所有调用都会给出与我粘贴的相同的消息。

icc 是否因为在完全没有循环的地方显示矢量化消息而陷入困惑?还是我误会了什么?

编辑:我已经半复制了这个问题。这一次,编译器告诉它它向量化了一行代码,其中有一个调用另一个函数(在原来的情况下只是另一种方式,它说它不能)。这是代码:

 1 
2
3 void foo(float *a, float *b, float *c, int n1, int n2, int n3, int ini3, int end3 ) {
4 int i, j, k;
5
6 for( i = ini3; i < end3; i++ ) {
7 for( j = 0; j < n2; j++ ) {
8 #pragma simd
9 #pragma ivdep
10 for( k = 0; k < 4; k ++ ) {
11 int index = k + j*n1 + i*n1*n2;
12 a[index] = b[index] + 2* c[index];
13 }
14 }
15 }
16
17 for( i = ini3; i < end3; i++ ) {
18 for( j = 0; j < n2; j++ ) {
19 #pragma simd
20 #pragma ivdep
21 for( k = n1-4; k < n1; k ++ ) {
22 int index = k + j*n1 + i*n1*n2;
23 a[index] = b[index] + 2* c[index];
24 }
25 }
26 }
27
28 return;
29 }
30 int main(void){
31 int n1, n2, n3;
32 int ini3 = 20;
33 int end3 = 30;
34 n1 = n2 = n3 = 200;
35
36 float *a = malloc( n1 * n2 * n3 * sizeof(float ));
37 float *b = malloc( n1 * n2 * n3 * sizeof(float ));
38 float *c = malloc( n1 * n2 * n3 * sizeof(float ));
39
40 foo( a,b,c, n1, n2, n3, ini3, end3 );
41
42 ini3 += 50;
43 end3 += 50;
44
45 foo( a,b,c, n1, n2, n3, ini3, end3 );
46
47 free(a); free(b); free(c);
48
49 return 0;
50 }
51

还有优化报告中 ICC 说它矢量化了第 40 和 45 行的部分:

foo.c(40:4-40:4):VEC:main:  LOOP WAS VECTORIZED
loop was not vectorized: not inner loop
loop was not vectorized: not inner loop
LOOP WAS VECTORIZED
loop was not vectorized: not inner loop
loop was not vectorized: not inner loop
foo.c(45:4-45:4):VEC:main: LOOP WAS VECTORIZED
loop was not vectorized: not inner loop
loop was not vectorized: not inner loop

这正常吗?

最佳答案

在您发布的示例中,对 foo() 的函数调用是内联的。 foo() 内的循环在内联后 被矢量化。

结果是所有代码都“折叠”到第 40 和 45 行。当 vectorizo​​r 接触代码时,它不知道它最初来自不同的函数。

在你说它不是向量化的原始例子中,同样的情况也适用。函数调用是内联的,但它包含不可向量化的循环。


或许,ICC 可以通过函数调用保留线路信息。但是每次内联函数时,您都会得到一份重复的矢量化报告。此外,它们都指向同一条线。这可能会更加令人困惑。

关于c - ICC 选择报告 "subscript too complex",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13601385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com