2015-10-06 1 views
0

J'ai un code qui dépend des données.Supprimer la dépendance des données dans C

exemple de code:

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]++; 
} 

Je veux supprimer la dépendance de données pour paralléliser ce code. Je sais que je dois modifier mon code, mais je ne sais pas comment le réparer.

Comment dois-je réparer ce code?

+1

Je ne vois pas une dépendance de données, mais parfois le compilateur devient confus quand vous faites des mathématiques d'indexation à l'intérieur des crochets. Tant que vous privatisez a, b et c, cela devrait être parallélisable. Puisque vous avez étiqueté ceci avec openacc, je suggérerais d'utiliser 'acc parallel loop' au lieu de' acckernels' si le compilateur vous dit qu'il ne peut pas paralléliser en raison d'une dépendance aux données. – jefflarkin

+0

En fait, j'ai trouvé la dépendance des données d'un autre code comme ça (NVVP utilisé). Mais comme cet exemple de code, NVVP ne me dit pas qui rend la dépendance aux données. Je pense que la dépendance de mon vrai code s'est produite d'autres raisons. Je vais essayer de trouver une autre raison. Merci de votre aide, jeff. :) – soongk

+0

Deux choses à rechercher: 1) Si vous accédez à plusieurs tableaux, assurez-vous que les pointeurs sont déclarés 'restrict' afin que le compilateur sache qu'ils n'ont pas d'alias. 2) Indexation mathématique à l'intérieur des crochets. – jefflarkin

Répondre

0

Essayez:

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]++; 
}