Parece que tiene un #include
extraño, lo que hace que el código compilado por el compilador incorrecto. Haga una distinción entre los encabezados gpu y los encabezados de la CPU usando .cu.h para encabezados cuda. Asegúrese de solo NVCC compila .cu
y .cu.h
archivos. Los archivos Cuda nunca deberían incluirse en archivos cpp. La llamada al kernel y kernel debe estar en los archivos .cu
o .cu.h
, y esos archivos no se deben incluir en ningún lado en cpps.
Debido a que su .cu
está siendo incluido en una cabecera que está siendo compilado por el compilador de acogida, el compilador de acogida termina golpeando el token <<<
- el cual no reconoce. Probablemente no entienda el token <<
por lo que consume eso, dejando un inesperado <
.
Aquí es una forma alternativa de hacer las cosas que deben trabajar (no lo intentó pero es similar al código que utilizamos)
(nota, esto podría funcionar, pero también podría no ser el camino correcto para resolver el problema . Mi jefe no le gusta como solución y preferiría agregar una implementación por variación)
El problema subyacente parece ser la falta de distinción entre el host y el código del dispositivo. Dejo el detalle en mi solución: cosas como copiar resultados desde y hacia el dispositivo, implementación de suma, etc.
El problema que estoy tratando de resolver es, dado un constructo, cómo se puede moldear para usar ambos en el host y el dispositivo?
Voy a la plantilla Matrix.h
tanto en el tipo como en los detalles de implementación.
template <typename T, typename Implementation<T> > class Matrix {
void sum(Matrix<T>& m1, Matrix<T>& m2, Matrix<T>& sum)
{
Implementation.sumImp(m1, m2, sum);
}
}
La aplicación de host, HostMatrixSum.h
va a hacer las cosas los de la CPU:
#include "Matrix.h"
template <typename T> struct HostMatrixSum
{
void sumImp(Matrix<T>& m1, Matrix<T>& m2, Matrix<T>& sum)
{
...
}
}
Mientras GpuMatrixSum.cu.h
va a cargar la matriz, hacer la suma y recuperar los resultados:
#include "Matrix.h"
template <typename T> struct GpuMatrixSum
{
template<typename T> __global__ void sumKernel(const Matrix<T> m1, const Matrix<T> m2, Matrix<T> sum)
{
...
}
void sumImp(Matrix<T>& m1, Matrix<T>& m2, Matrix<T>& sum)
{
...
sumKernel<T> <<< dimGrid, dimBlock >>> (m1,m2);
...
}
}
Entonces cuando utilizamos Matrix desde el código de host, utilizamos la plantilla en la implementación de la suma de host y nunca necesitamos ver ninguna especificación de cuda:
#include "Matrix.h"
#include "HostMatrixSum.h"
Matrix<int, HostMatrixSum> m1 = Matrix<int>(...);
Matrix<int, HostMatrixSum> m2 = Matrix<int>(...);
Matrix<int, HostMatrixSum> result;
Matrix.sum(m1,m2,result);
Y si estamos trabajando en la GPU podemos utilizar la aplicación GPU acelerada de la suma:
#include "Matrix.h"
#include "GpuMatrixSum.cu.h"
Matrix<int, GpuMatrixSum> m1 = Matrix<int>(...);
Matrix<int, GpuMatrixSum> m2 = Matrix<int>(...);
Matrix<int, GpuMatrixSum> result;
Matrix.sum(m1,m2,result);
la esperanza de que funcione para usted!
No sabía que pudiera usar CUDA y C++ (!). Sugerencia trivial: intente poner un espacio entre '' y '<<<' en caso de que ejecutarlos juntos esté causando problemas de análisis. –
Rup
¿Le dijo el compilador en qué línea está el error? Hay muchos
@Rup: sí, puedes. Incluso puede pasar objetos como argumentos a los núcleos (siempre que haya copiado los datos de interés en la memoria del dispositivo). Voy a intentar tu sugerencia también. @Bomadeno: el error está en la línea que realiza la llamada al kernel. – Renan