son - tarjetas compatibles con cuda
diferentes nĂșcleos para diferentes arquitecturas (2)
Me pregunto si hay alguna manera fácil de tener diferentes versiones de un kernel para diferentes arquitecturas. ¿Es su una manera fácil? ¿o la única posibilidad es definir kernels independientes en archivos independientes y pedirle a nvcc que compile a diferentes arquitecturas por archivo?
Puedes hacerlo mediante las directivas del compilador. Algo como
__global__ void kernel(...) {
# if __CUDA_ARCH__ >= 350
do something
# else
do something else
# endif
}
Con un poco más de C ++ JackOLanterns Respuesta ligeramente modificada:
template <unsigned int ARCH>
__global__ void kernel(...)
{
switch(ARCH)
{
case 35:
do something
break;
case 30:
do something else
break;
case 20:
so something else
break;
default:
do something for all other ARCH
break;
}
}
EDITAR: para eliminar el error @ sgar91 señalado:
puede llamar al núcleo con las propiedades de su dispositivo CUDA consultado a través de
cudaGetDeviceProperties(&props, devId);
unsigned int cc = props.major * 10 + props.minor;
switch(cc)
{
case 35:
kernel<35><<<1, 1>>>(/* args */);
break;
...
}