tutorial - Función CUDA pow con argumentos enteros
cuda ultima version (1)
Su problema es que mientras pow
se define en la API matemática de CUDA (ver aquí ), no es una plantilla especializada para argumentos enteros, es decir. no hay una versión como esta:
__device__ int pow ( int x, int y )
Es por eso que está obteniendo un error. Tendrá que convertir explícitamente el argumento base en un tipo de punto flotante como este:
dist_dev[idx] = pow((double)(x_d[idx] - x_d[i]), 2.0) +
pow((double)(y_d[idx] - y_d[i]), 2.0);
Habiendo dicho eso, utilizar exponencial de coma flotante de doble precisión en su ejemplo para un cuadrado entero será pobre desde el punto de vista de la eficiencia. Sería preferible realizar el cálculo usando la multiplicación entera en su lugar:
int dx = x_d[idx] - x_d[i];
int dy = y_d[idx] - y_d[i];
dist_dev[idx] = (dx * dx) + (dy * dy);
Soy nuevo en CUDA, y no puedo entender lo que estoy haciendo mal.
Estoy tratando de calcular la distancia del objeto que tiene id en la matriz, el eje x en la matriz y el eje y en la matriz para encontrar vecinos para cada objeto
__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
}
}
}
¿El pow
no está definido en el código kernel?