Intel® C++ Compiler
Support and discussions for creating C++ code that runs on platforms based on Intel® processors.
Announcements
This community is designed for sharing of public information. Please do not share Intel or third-party confidential information here.
7678 Discussions

icpc: loop condition false inside the loop

Dhairya_M_
Beginner
231 Views

I have been trying to debug a code for the last two weeks, and I have narrowed it down to this simple code which reproduces the issue.

#include <cassert>

template <class T>
class Vector{
 public:
  Vector(){dim=0;}
  ~Vector(){};
  inline int Dim() const{return dim;}
 private:
  int dim;
};

int main(int argc, char **argv){
  Vector<int> v;
  #pragma omp parallel for
  for(int trg=0;trg<v.Dim();trg++){
    assert(trg<v.Dim());
    Vector<int> vbuff[2];
  }
  return 0;
}

I compile the code with icpc version 12.1.6 as follows:

icpc -O0 -openmp main.cpp

When I run the executable, I get:

    a.out: main.cpp:17: int main(int, char **): Assertion `trg<v.Dim()' failed.

Can someone help me figure out what is going on?

Additional details: OS is Scientific Linux release 6.6 (Carbon). CPU is Intel(R) Xeon(R) CPU E5-2687W 0 @ 3.10GHz

0 Kudos
1 Solution
Shenghong_G_Intel
231 Views

I've reproduce it with v12 compiler (12.1.4, composer 2011 sp1 update 11), and debug with gdb, it looks like 'trg' is not initialized correctly.

Breakpoint 1, L_main_17__par_loop0_2_30 () at temp.cpp:21
21          assert(trg<v.Dim());
(gdb) display trg
1: trg = 4
(gdb) display v.Dim()
2: v.Dim () = 0
(gdb)

Logically, the for loop should never been executed as v.Dim() is 0. Also, adding something like "printf("%d\n", trg)" inside the loop, it works and nothing printed as expected. 

Summary: It seems to be a bug of old compiler (maybe OpenMP library?), you may have to upgrade to a new version.

Thanks,

Shenghong

View solution in original post

4 Replies
Shenghong_G_Intel
231 Views

I cannot reproduce it with v14.0 or v15.0 compiler, and the code pass with GCC too. I assume it may be a bug of v12.1 compiler. Do you have a chance to try a newer compiler release?

@Qiaoming, dim is initialized as zero in the ctor, the loop should not even be executed in this case. Even dim is not initialized (a random value), the assertion should pass.....

Thanks,

Shenghong

Shenghong_G_Intel
232 Views

I've reproduce it with v12 compiler (12.1.4, composer 2011 sp1 update 11), and debug with gdb, it looks like 'trg' is not initialized correctly.

Breakpoint 1, L_main_17__par_loop0_2_30 () at temp.cpp:21
21          assert(trg<v.Dim());
(gdb) display trg
1: trg = 4
(gdb) display v.Dim()
2: v.Dim () = 0
(gdb)

Logically, the for loop should never been executed as v.Dim() is 0. Also, adding something like "printf("%d\n", trg)" inside the loop, it works and nothing printed as expected. 

Summary: It seems to be a bug of old compiler (maybe OpenMP library?), you may have to upgrade to a new version.

Thanks,

Shenghong

Dhairya_M_
Beginner
231 Views

Many thanks for the quick response. I will ask system admins to install newer version of the compiler.

Thanks,

Dhairya

Kittur_G_Intel
Employee
231 Views

Hi Dairya,

Yes I tried as well and this  test will fail with all versions of 12.X, 13.X  but will pass with 14.X and the latest 15.X version. There were some changes made to countable loops if I recall and hence the only way is for you to upgrade to newer version :-(

_Kittur 

Reply