Итак, похоже, у вас есть странный #include
, приводящий к компиляции кода неправильным компилятором. Различайте заголовки gpu и заголовки cpu, используя .cu.h для заголовков cuda. Убедитесь, что только NVCC компилирует .cu
и .cu.h
файлы. Файлы Cuda никогда не должны включаться в файлы cpp. Ядро и вызов ядра должны быть в файлах .cu
или .cu.h
, и эти файлы не должны быть включены нигде в cpps.
Поскольку ваш .cu
включается в заголовок, который компилируется компилятором хоста, компилятор хоста в итоге нажимает на токен <<<
- который он не распознает. Вероятно, он понимает токен <<
, поэтому потребляет его, оставляя неожиданный <
.
Вот альтернативный способ работы, который должен работать (не пробовал, но он похож на код, который мы используем)
(обратите внимание, это может сработать, но также может оказаться неправильным способом решения проблемы. Моему боссу не нравится это решение, и он предпочел бы добавить реализацию для каждого варианта)
Основной проблемой, по-видимому, является отсутствие различия между кодом хоста и устройства. Я опускаю детали своего решения - такие как копирование результатов на устройство и с него, реализация суммы и т. Д.
Проблема, которую я пытаюсь решить, с учетом конструкции, как вы можете шаблонизировать ее для использования как на хосте, так и на устройстве?
Я буду шаблон Matrix.h
как по типу, так и по деталям реализации.
template <typename T, typename Implementation<T> > class Matrix {
void sum(Matrix<T>& m1, Matrix<T>& m2, Matrix<T>& sum)
{
Implementation.sumImp(m1, m2, sum);
}
}
Реализация хоста, HostMatrixSum.h
будет делать то же на процессоре:
#include "Matrix.h"
template <typename T> struct HostMatrixSum
{
void sumImp(Matrix<T>& m1, Matrix<T>& m2, Matrix<T>& sum)
{
...
}
}
Пока GpuMatrixSum.cu.h
будет загружать матрицу, выполните суммирование и восстановите результаты:
#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);
...
}
}
Затем, когда мы приходим к использованию Matrix из кода хоста, мы формируем шаблон для реализации суммы хоста и никогда не должны видеть никаких особенностей 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);
И если мы работаем с GPU, мы можем использовать ускоренную реализацию GPU суммы:
#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);
Надеюсь, что это работает для вас!