तो, ऐसा लगता है कि आपके पास एक अजीब #include
है, जो गलत संकलक द्वारा संकलित कोड को जन्म देता है। Cuda शीर्षकों के लिए .cu.h का उपयोग कर जीपीयू हेडर और सीपीयू हेडर के बीच एक भेद बनाओ। सुनिश्चित करें कि केवल एनवीसीसी .cu
और .cu.h
फ़ाइलों को संकलित करता है। Cuda फ़ाइलों को कभी भी सीपीपी फाइलों में शामिल नहीं किया जाना चाहिए। कर्नेल और कर्नेल कॉल .cu
या .cu.h
फ़ाइलों में होना चाहिए, और उन फ़ाइलों को सीपीपीएस में कहीं भी शामिल नहीं किया जाना चाहिए।
क्योंकि आपके .cu
को हेडर में शामिल किया जा रहा है जिसे होस्ट कंपाइलर द्वारा संकलित किया जा रहा है, होस्ट कंपाइलर टोकन <<<
को टकराने से समाप्त होता है - जिसे यह पहचाना नहीं जाता है। यह शायद टोकन <<
को समझता है, इसलिए यह एक अप्रत्याशित <
छोड़कर इसका उपभोग करता है।
जिन कारणों से काम करना चाहिए ऐसा करने का एक वैकल्पिक तरीका है (इसे करने की कोशिश नहीं है, लेकिन यह कोड हम उपयोग करने के लिए समान है)
(ध्यान दें, यह काम हो सकता है लेकिन यह भी समस्या को हल करने के लिए सही रास्ता नहीं हो सकता है मेरे बॉस इसे एक समाधान के रूप में पसंद नहीं करते हैं और प्रति भिन्नता को कार्यान्वित करना पसंद करेंगे)
अंतर्निहित समस्या होस्ट और डिवाइस कोड के बीच भेद की कमी प्रतीत होती है। मैं अपने समाधान में विस्तार से बाहर निकल रहा हूं - डिवाइस से, और कार्यान्वयन, आदि से परिणामों की प्रतिलिपि बनाने जैसी चीजें
समस्या जिसे मैं हल करने की कोशिश कर रहा हूं, एक निर्माण दिया गया है, आप इसे कैसे टेम्पलेट कर सकते हैं मेजबान और डिवाइस दोनों पर प्रयोग करें?
मैं प्रकार और कार्यान्वयन विस्तार दोनों पर Matrix.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);
...
}
}
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 पर काम करेंगे जब हम होस्ट कोड से मैट्रिक्स का उपयोग करने के लिए आते हैं तो हम मेजबान योग कार्यान्वयन पर टेम्पलेट और किसी भी 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);
आशा है कि आप के लिए काम करता है! त्रुटि C2059: सिंटेक्स त्रुटि:
मुझे नहीं पता था कि आप CUDA और C++ (!) का उपयोग कर सकते हैं। मामूली सुझाव: '' के बीच एक जगह डालने का प्रयास करें और '<<<' उन्हें एक साथ चलाने के मामले में पार्स समस्याओं का कारण बन रहा है। –
Rup
क्या संकलक ने आपको बताया कि त्रुटि किस लाइन पर है? कूडा टेम्पलेट कोड में बहुत कुछ है, इसलिए यह किस लाइन को चालू करना है, इसे कम करने के लिए उपयोगी होगा। –
@Rup: हाँ, आप कर सकते हैं। आप वस्तुओं को कर्नेल के तर्क के रूप में भी पास कर सकते हैं (बशर्ते आपने डिवाइस मेमोरी में रुचि के डेटा की प्रतिलिपि बनाई हो)। मैं भी आपके सुझाव का प्रयास करूंगा। @ बोमाडेनो: त्रुटि उस रेखा पर है जो कर्नेल कॉल करता है। – Renan