Проблема при вызове ядра шаблона CUDA
Я пытался создать ядра шаблонов, но у меня возникли проблемы с их вызовом в моей программе. У меня есть Matrix<T>
класс шаблона и некоторые методы, определенные внутри него
Матрица.h:
template <typename T> class Matrix {
...
void sum(Matrix<T>& m1, Matrix<T>& m2, Matrix<T>& sum);
...
}
#include "Matrix.cu"
Матрица.ку:
#include "MatrixKernel.h"
template<typename T> void Matrix<T>::sum(const Matrix<T>& m, Matrix<T>& sum) {
...
sumKernel<T><<<dimGrid, dimBlock>>>(Matrix<T> m1, Matrix<T> m2, Matrix<T> sum)
...
}
MatrixKernel.h:
template<typename T> __global__ void sumKernel(const Matrix<T> m1, const Matrix<T> m2, Matrix<T> sum) {
...
}
проблема в том, что когда я вызываю sumKernel изнутри sum, компилятор дает мне следующую ошибку:
error C2059: syntax error : '<'
кто-нибудь знает, что происходит? Код скомпилированный штраф перед тем, как я включил вызов sumKernel.
спасибо.
2 ответов
Итак, кажется, у вас есть странный #include
, что приводит к компиляции кода неправильным компилятором. Сделайте различие между заголовками gpu и заголовками cpu с помощью .КР.h для заголовков cuda. Убедитесь только NVCC составляет .cu
и .cu.h
файлы. Файлы Cuda никогда не должны включаться в файлы cpp. Ядро и вызов ядра должны быть в .cu
или .cu.h
файлы, и эти файлы не должны быть включены нигде в cpps.
потому что .cu
is будучи включенным в заголовок, который компилируется хост-компилятором, хост-компилятор попадает в токен <<<
- который он не признает. Вероятно, он понимает токен <<
так что он потребляет, что, оставляя неожиданный <
.
вот альтернативный способ делать то, что должно работать (не пробовал, но похоже на код, который мы используем)
(обратите внимание, что это может сработать, но это также может быть неправильным способом решения проблемы. Мой босс не любит его как решение и предпочел бы добавить реализацию на вариант)
основной проблемой, по-видимому, является отсутствие различия между кодом хоста и устройства. Я оставляю детали в своем решении - такие вещи, как копирование результатов на устройство и с устройства, реализация суммы и т. д.
проблема, которую я пытаюсь решить, это, учитывая конструкцию, как вы можете ее шаблон для использования как на хосте, так и на устройстве?
я шаблон 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
будет делать вещи на cpu:
#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);
...
}
}
затем, когда мы приходим использовать матрицу из кода хоста, мы шаблон на реализации суммы хоста и никогда не должны видеть никаких особенностей 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 sum:
#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);
надеюсь, что это работает для вас!
У меня была та же проблема: ошибка C2059: синтаксическая ошибка : '
во-первых, я нашел хорошую настройку/учебник здесь (для visual express 2010 и cuda 4.0): http://www.stevenmarkford.com/installing-nvidia-cuda-with-visual-studio-2010/
и чтобы решить проблему синтаксической ошибки, это решило ее: как запустить приложение CUDA в Visual Studio 2010?
в частности, изменение свойства *.cu файл такой, что: Type имеет значение " CUDA C / C++"
наконец-то сработало для меня.