2013-05-05 3 views
1

Je suis nouveau dans CUDA, et je ne peux pas comprendre ce que je fais mal.CUDA pow fonction avec des arguments entiers

Je suis en train de calculer la distance de l'objet, il a id dans le tableau, l'axe x dans le tableau et l'axe y dans le tableau pour trouver les voisins pour chaque objet

__global__ 
void dist(int *id_d, int *x_d, int *y_d, 
       int *dist_dev, int dimBlock, int i) 
{ 
    int idx = threadIdx.x + blockIdx.x*blockDim.x; 

    while(idx < dimBlock){ 
     int i; 
     for(i= 0; i< dimBlock; i++){ 
      if (idx == i)continue; 
      dist_dev[idx] = pow(x_d[idx] - x_d[i], 2) + pow(y_d[idx] - y_d[i], 2); // error here 
     } 
    } 
} 

est-pow pas défini dans le code du noyau?

Répondre

6

Votre problème est que tandis que pow est défini dans l'API math CUDA (voir here), ce n'est pas un modèle spécialisé pour les arguments entiers, c'est-à-dire. il n'y a pas de version comme celle-ci:

__device__ ​ int pow (int x, int y) 

C'est pourquoi vous obtenez une erreur. Vous aurez besoin de jeter explicitement l'argument de base à un type à virgule flottante comme ceci:

dist_dev[idx] = pow((double)(x_d[idx] - x_d[i]), 2.0) + 
        pow((double)(y_d[idx] - y_d[i]), 2.0); 

Ceci étant dit, en utilisant le double virgule flottante précision exponentielle dans votre exemple pour un carré entier sera faible d'un point de vue de l'efficacité . Il serait préférable d'effectuer le calcul en utilisant à la place multiplication d'entiers:

int dx = x_d[idx] - x_d[i]; 
int dy = y_d[idx] - y_d[i]; 
dist_dev[idx] = (dx * dx) + (dy * dy); 
+0

dist_dev [idx] = ((x_d [idx] - x_d [i]) * (x_d [idx] - x_d [i])) + ((y_d [idx] - y_d [i]) * (y_d [idx] - y_d [i])); – Alamin

+1

@Alamin: C'est identique au dernier extrait de code dans ma réponse. Essayiez-vous de faire valoir un point quelconque? – talonmies

Questions connexes