2015-10-06 3 views
0

У меня есть код, который имеет зависимость от данных.Удалить зависимость данных в C

пример кода:

int data[1000*3]; 
int result[1000]={0,}; 

// initialize data[] 

for(i=0; i<1000; i++) 
{ 
    a = data[i*3 + 0]; 
    b = data[i*3 + 1]; 
    c = data[i*3 + 2]; 

    if((a>b) && (a>c)) // This line makes data dependency 
     result[i]++; 
} 

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

Как мне исправить этот код?

+1

Я не вижу зависимость данных, но иногда компилятор запутывается, когда вы делаете индексацию математику в квадратных скобках. Пока вы приватизируете a, b и c, это должно быть параллелизуемо. Поскольку вы отметили это с помощью openacc, я бы предложил использовать 'acc parallel loop' вместо' acc kernels', если компилятор сообщает вам, что он не может распараллеливаться из-за зависимости данных. – jefflarkin

+0

Фактически, я нашел зависимость от другого кода (используемого NVVP). Но, как этот пример кода, NVVP не говорит мне, что делает зависимость данных. Я думаю, что зависимость моего реального кода происходила по другим причинам. Я попытаюсь найти другую причину. Благодарим вас за помощь, jeff. :) – soongk

+0

Две вещи, которые нужно искать: 1) Если вы обращаетесь к нескольким массивам, убедитесь, что указатели объявлены 'ограничивать ', поэтому компилятор знает, что они не сглажены. 2) Индексирование математики внутри квадратных скобок. – jefflarkin

ответ

0

Try:

int data[1000*3]; 
int result[1000]={0,}; 

// initialize data[] 

for(i=0; i<1000; i++) 
{ 
    if((data[i*3 + 0] > data[i*3 + 1]) && (data[i*3 + 0] > data[i*3 + 2])) 
     result[i]++; 
} 
Смежные вопросы