2012-03-30 11 views

Respuesta

26

Lamentablemente no se puede llamar a las funciones de dispositivo que no se especifican con __device__ modificador. Si necesita un número al azar en la mirada de código de dispositivo en el generador aleatorio CUDA curandhttp://developer.nvidia.com/curand

Si usted tiene su propia función de host que desea llamar desde un uso kernel tanto los __host__ y __device__ modificadores en él:

__host__ __device__ int add(int a, int b) 
{ 
    return a + b; 
} 

Cuando este archivo es compilado por el controlador del compilador NVCC, se compilan dos versiones de las funciones: una que se puede llamar por código de host y otra que se puede llamar por código de dispositivo. Y esta es la razón por la cual esta función ahora se puede llamar tanto por el host como por el código del dispositivo.

+1

¿Qué tan malo es la degradación del rendimiento al llamar a una función de host en lugar de usar una cuda incorporada? – Mattia

+0

¿Esto implica que el host y el dispositivo solo ejecutarán sus propias copias respectivas de las funciones? – avgvstvs

5

Aunque no es aplicable a 'rand()', pero un par de funciones de acogida como "printf" están disponibles al compilar con compatibilidad de cómputo> = 2.0

por ejemplo:

nvcc.exe -gencode=arch=compute_10,code=\sm_10,compute_10\... 
error : calling a host function("printf") from a __device__/__global__ function("myKernel") is not allowed 

Compila y trabaja con sm_20 , compute_20

7

La respuesta corta es que aquí no hay solución a ese problema.

Todo lo que normalmente se ejecuta en una CPU debe adaptarse a un entorno CUDA sin garantías de que sea posible. Las funciones de host son solo otro nombre en CUDA para las funciones C ordinarias. Es decir, las funciones que se ejecutan en una arquitectura Von Neumann con memoria de CPU como todas las C/C++ han sido hasta este punto en las PC. Las GPU le brindan enormes cantidades de potencia informática, pero el costo es que no es tan flexible o compatible. Lo más importante es que las funciones se ejecutan sin la capacidad de acceder a la memoria principal y la memoria a la que pueden acceder es limitada.

Si lo que intenta obtener es un generador de números aleatorios, tiene suerte ya que Nvidia se tomó la molestia de implementar específicamente un Mersenne Twister altamente eficiente que puede admitir hasta 256 hilos por SMP. Se puede llamar dentro de una función del dispositivo, descrita en una publicación anterior de la mina here. Si alguien encuentra un enlace mejor que describa esta funcionalidad, por favor elimine el mío y reemplace el texto apropiado aquí junto con el enlace.

Una cosa que me sorprende continuamente es la cantidad de programadores que parecen desconocer qué tan estandarizados son los generadores de números pseudoaleatorios de alta calidad. "Rodar uno mismo" realmente no es una buena idea teniendo en cuenta la cantidad de números pseudoaleatorios de un arte. Verificación de un generador de números como proporcionar aceptablemente impredecibles requiere mucho trabajo y talento académico ...

-1

puedo estar de acuerdo con algunas de las otras respuestas en el siguiente sentido:

OP no describe un problema : no es desafortunado que no pueda llamar a las funciones __host__ desde el código del dispositivo; es completamente imposible que sea de otra manera, y eso no es malo.

Explicar: piense en el código de host (CPU) como un CD que coloca en un reproductor de CD; y en el código del dispositivo como, digamos, una tarjeta SD que colocas en un reproductor de música en miniatura.La pregunta de OP es "¿cómo puedo meter un disco en mi reproductor de música en miniatura"? No puedes, y no tiene sentido quererlo. Puede ser esencialmente la misma música (código con la misma funcionalidad, aunque generalmente el código de host y el código del dispositivo no realizan la misma tarea de cálculo), pero los medios no son intercambiables.

Cuestiones relacionadas