我能夠將普通對象作爲副本傳遞給內核函數。但是,當我將虛擬繼承添加到類層次結構時,我收到一條錯誤消息,指出具有用戶定義的副本構造函數的類不能用作內核啓動的參數。但是,我沒有用戶定義的複製構造函數。所以我想這是因爲虛擬繼承的內部實現實現了一些不同類型的複製構造函數。有人可以解釋虛擬繼承是如何實際實現的嗎?是否有任何解決方法,或者在編寫cuda代碼時絕對沒有辦法使用虛擬繼承?虛擬繼承傳遞給cuda內核函數的對象
的代碼是這樣的:
class Base {...};
class ChildA: public virtual Base {...};
class ChildB: public virtual Base {...};
class GrandChild: public ChildA, public ChildB {...};
__global__ void mykernel(Base x) {...}
int main() {
GrandChild x;
mykernel<<<1,1>>>(x);
return 0;
}
編輯: 這是我的猜測:我覺得NVCC只允許默認的拷貝構造函數,因爲在這種情況下,它可以簡單地使用cudaMemcpyAsync的論點推入設備內部的調用堆棧。所以它對編譯器進行了硬編碼,使得只允許使用默認的複製構造函數,但是具有虛擬繼承的對象在內部具有不同類型的複製構造函數,從而觸發了nvcc中的錯誤。不過,我仍然相信nvcc應該有一個簡單的方法允許它,只要nvcc支持虛函數和其他高級C++功能。
在這裏看看它是如何實現的(在gcc中)http://www.phpcompiler.org/articles/virtualinheritance.html;它可能會給你一個第一個想法。只要虛擬功能得到支持,我就不會看到支持虛擬繼承的技術限制的簡單解釋。 – Joky
您正在按值傳遞x。 – IdeaHat
您可能感興趣的[this](http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#virtual-functions) –