2015-02-25 5 views
0

У меня возникла проблема, когда я играл с функцией автоматического распараллеливания Oracle Solaris Compiler. Скажем, у меня есть следующий код:автоматическая распараллеливание небезопасных вызовов

int var = -1; 
int i; 
for (i = 0; i < 3; i++){ 
    bool flag = false; 
    // do operations to set the flag 
    if (flag == true) 
    var = i; 
} 
// do other operations with var 

, когда я запускаю этот код, компилятор жалуется, что не может быть распараллелены из-за опасных зависимостей.

Кто-нибудь знает, что может быть неправильным здесь? Есть ли способ избежать этого, но сохранить исходную функциональность кода?

Любая помощь будет оценена, спасибо!

+0

Я не работал с этим компилятором, но вы можете попробовать '#pragma MP taskloop storeback (var)' before for loop –

+0

Очень маловероятно, что ветвь if вызвала зависимость. Я предполагаю, что существует больше зависимостей между циклами, которые предотвращают запуск следующего цикла до завершения текущего. Обычно это сглаживание указателей, попробуйте добавить ограниченные ключевые слова к вашим указателям, где это безопасно. – user3528438

ответ

0

То, что видит компилятор, представляет собой кучу итераций цикла, все из которых потенциально могут быть назначены V. Если запись на V имеет значение, то она будет иметь некоторое случайное значение i, и можно утверждать, что это нормально. В предположении, что запись в переменную не является атомарной, большинство компиляторов рассматривают это как гонку данных ... (тогда то, что точно заканчивается в V?). Таким образом, жалоба.

Смежные вопросы