Проблема при вызове шаблона ядра CUDA - PullRequest
7 голосов
/ 14 июня 2011

Я пытался создать шаблонные ядра, но у меня были некоторые проблемы с вызовом их в моей программе.У меня есть Matrix<T> шаблонный класс и некоторые методы, определенные внутри него

Matrix.h:

template <typename T> class Matrix {
    ...
    void sum(Matrix<T>& m1, Matrix<T>& m2, Matrix<T>& sum);
    ...
}

#include "Matrix.cu"

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 ]

5 голосов
/ 14 июня 2011

Итак, похоже, у вас есть странный #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);

Надеюсь, что это работает для вас!

1 голос
/ 12 января 2012

У меня была такая же проблема: ошибка C2059: синтаксическая ошибка: '<' </p>

Во-первых, я нашел хорошую настройку / руководство здесь (для Visual Express 2010 и CUDA 4.0): http://www.stevenmarkford.com/installing-nvidia-cuda-with-visual-studio-2010/

и для решения проблемы синтаксической ошибки это решило ее: Как запустить приложение CUDA в Visual Studio 2010?

В частности, изменив свойство * .cuфайл такой, что: Тип установлен в "CUDA C / C ++"

Наконец-то сработало для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...