gpus example developer compatible card c++ c cuda gpgpu value-type

c++ - example - nvidia gpu



Operaciones en tipos de valores arbitrarios (5)

Debido a la forma en que se compilan las plantillas en C ++, simplemente hacemos:

template < class T > T add(T const & val1, T const & val2) { return val1 + val2; }

funcionará, obtendrá un error de compilación para cada tipo en el que un operador + no está definido.

Las plantillas de C ++ generan código para cada instanciación de tipo, de modo que para cada tipo se generará un código T que haga lo correcto. De esta forma C ++ no necesita Num <> truco.

En la C simple, esto no es posible por lo que sé.

Este artículo describe una forma, en C #, para permitir la adición de tipos de valores arbitrarios que tienen un operador + definido para ellos. En esencia, permite el siguiente código:

public T Add(T val1, T val2) { return val1 + val2; }

Este código no se compila ya que no hay garantía de que el tipo T tenga una definición para el operador ''+'', pero el efecto se logra con un código como este:

public T Add(T val1, T val2) { //Num<T> defines a ''+'' operation which returns a value of type T return (new Num<T>(val1) + new Num<T>(val2)); }

Siga el enlace para ver cómo la clase Num logra esto. De todos modos, a la pregunta. ¿Hay alguna forma de lograr el mismo efecto en C o C ++? Para los curiosos, el problema que trato de resolver es permitir que un kernel de CUDA sea más flexible / general al permitir que opere en más tipos.

Actualización: para .NET, Marc Gravell ha creado una biblioteca de utilidades que resuelve el problema del operador de forma muy elegante.


Esto se puede hacer fácilmente en C ++ usando plantillas:

template <typename T> T Add(T val1, T val2) { return val1 + val2; }

Tenga en cuenta, sin embargo, que esto debe definirse en un archivo de encabezado, y probablemente también quiera pasar los parámetros por const reference en lugar de por valor.

Esto no se puede hacer en absoluto C en absoluto.


Plantillas en C ++. En C, no sin molestias masivas y gastos generales.

template<typename T> T add(T x, T y) { return x + y; }


También se puede hacer en C, aunque no estoy seguro de que cumpla con los requisitos del problema, con una macro.

#define ADD(A,B) (A+B)


En C ++ esto simplemente no es un problema. El código como en su primer ejemplo funciona si se traduce literalmente a C ++ (ETA: como lo hizo Pieter), pero no puedo pensar en ninguna situación donde el uso directo de + no funcione. Está buscando una solución a un problema que no existe.