所以,看來你確實有一個奇怪的#include
,導致代碼過得去錯誤編譯器編譯。通過爲cuda頭文件使用.cu.h來區分gpu頭文件和cpu頭文件。確保只有 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
會做的事情上的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);
...
}
}
然後當我們從主機代碼中使用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);
希望對你有用!
我不知道你可以使用CUDA和C++(!)。瑣碎的建議:嘗試在''和'<<<'之間放置一個空格,以防將它們放在一起導致解析問題。 –
Rup
2011-06-14 10:43:33
編譯器是否告訴你哪一行出錯?在cuda模板代碼中有很多
2011-06-14 10:45:34@Rup:是的,你可以。您甚至可以將對象作爲參數傳遞給內核(只要您將感興趣的數據複製到設備內存)。我也會嘗試你的建議。 @Bomadeno:錯誤在執行內核調用的線上。 – Renan 2011-06-14 15:42:24