Intel® C++ Compiler
Community support and assistance for creating C++ code that runs on platforms based on Intel® processors.

OpenMP task bug under Linux

vladimir_gajinov
Beginner
471 Views
I am using icc compiler version 10.0.504 under Ubuntu Linux.

The example from the specification for the taskq directive is running OK when the list pointer is argument of the function, but if it is a global variable I get the following error during compilation

icc -openmp -o main.o -c main.c
(0): internal error: backend signals

compilation aborted for main.c (code 4)
make[1]: *** [main.o] Error 4



This is the code I used to test this:

#include
#include


typedef struct list_s
{
struct list_s *next;
char data;
} list;


list *myp;


void do_work1(list *node)
{
printf("Thread %d - %c ", omp_get_thread_num(), node->data);
}



void test1()
{
#pragma intel omp parallel taskq shared(myp)
{
while (myp != NULL)
{
#pragma intel omp task captureprivate(myp)
{
do_work1(myp);
}
myp = myp->next;
}
}
}



int main()
{
list a, b, c;

omp_set_num_threads(3);

c.next = NULL;
c.data = 'c';
b.next = &c;
b.data = 'b';
a.next = &b;
a.data = 'a';
myp = &a;

test1();

return 1;
}

What I figured out so far is that the problem is in captureprivate clause. For example if i just put myp in firstprivate clause of taskq, and remove the captureprivate clause from task directive, the program compiles and runs well.

Also if I keep captureprivate clause, but use private instead of shared clause in the taskq directive, the program will compile, but the results will be incorect, as expected.
0 Kudos
4 Replies
vladimir_gajinov
Beginner
471 Views
Can I have any update on this, please!
0 Kudos
TimP
Honored Contributor III
471 Views
Did you file a support question on your premier.intel.com account?
0 Kudos
Martyn_C_Intel
Employee
471 Views

Hi,

This looks to me like a problem with the Intel work queueing extension, which was introduced at a time when the OpenMP standard did not support tasking. However, that has since changed, and the OpenMP 3.0 standard supports a task construct with comparable functionality but different syntax. This is in turn supported by version 11 of the Intel compiler. I'm not expert in this area, but I think this is how you would rewrite your test1 function for OpenMP 3.0:

void test1()

{

#pragma omp parallel shared(myp)

{

#pragma omp single

{

while (myp != NULL)

{

#pragma omp task firstprivate(myp)

{

do_work1(myp);

}

myp = myp->next;

}

}

}

}

Note the use of firstprivate instead of captureprivate, and of the single construct (to ensure that each task is submitted once only) instead of taskq. When I tried it, it seemed to work.

Because there is now a standard way to do tasking, I'm somewhat doubtful whether more work will be done on the Intel-specific extension. I see that you are using an older version 10.0 compiler - I'd encourage you to try the latest version (11.1) if possible, you can download an evaluation version from http://software.intel.com/en-us/intel-compilers/ (click on evaluate). With this compiler, the OpenMP 3.0 tasking model is the default; if you want to go back to the older Intel extension, you need to use the switch -openmp-task intel .

0 Kudos
Dale_S_Intel
Employee
471 Views

And just to be clear, in addition, latest compiler (11.1) doesn't crash compiling this :-)

Dale

0 Kudos
Reply