2015-06-23 21 views
7

मैं समझने की कोशिश कर रहा हूं कि अलग-अलग शीर्षलेख फ़ाइलों में CUDA __device__ कोड को कैसे रद्द किया जाए।CUDA __device__ अनसुलझा बाहरी फ़ंक्शन

मेरे पास तीन फाइलें हैं।

फ़ाइल: 1: int2.cuh

#ifndef INT2_H_ 
#define INT2_H_ 

#include "cuda.h" 
#include "cuda_runtime.h" 
#include "device_launch_parameters.h" 

__global__ void kernel(); 
__device__ int k2(int k); 

int launchKernel(int dim); 

#endif /* INT2_H_ */ 

फ़ाइल 2: int2.cu

#include "int2.cuh" 
#include "cstdio" 

__global__ void kernel() { 
    int tid = threadIdx.x; 
    printf("%d\n", k2(tid)); 
} 

__device__ int k2(int i) { 
    return i * i; 
} 

int launchKernel(int dim) { 
    kernel<<<1, dim>>>(); 
    cudaDeviceReset(); 
    return 0; 
} 

फ़ाइल 3: CUDASample.cu

include <stdio.h> 
#include <stdlib.h> 
#include "int2.cuh" 
#include "iostream" 

using namespace std; 

static const int WORK_SIZE = 256; 

__global__ void sampleCuda() { 
    int tid = threadIdx.x; 
// printf("%d\n", k2(tid)); //Can not call k2 
    printf("%d\n", tid * tid); 
} 

int main(void) { 

    int var; 
    var = launchKernel(16); 

    kernel<<<1, 16>>>(); 
    cudaDeviceReset(); 

    sampleCuda<<<1, 16>>>(); 
    cudaDeviceReset(); 

    return 0; 
} 

कोड फ़ाइल काम करता है। मैं sampleCuda() कर्नेल (उसी फ़ाइल में) को कॉल कर सकता हूं, सी फ़ंक्शन launchKernel() (अन्य फ़ाइल में) पर कॉल करें, और सीधे kernel() पर कॉल करें (अन्य फ़ाइल में)।

जिस समस्या का सामना कर रहा हूं वह फ़ंक्शन sampleCuda() कर्नेल से कॉल कर रहा है। तो यह निम्न त्रुटि दिखाता है। हालांकि, एक ही समारोह kernel() में कॉल करने योग्य है।

10:58:11 **** Incremental Build of configuration Debug for project CUDASample **** 
make all 
Building file: ../src/CUDASample.cu 
Invoking: NVCC Compiler 
/Developer/NVIDIA/CUDA-6.5/bin/nvcc -G -g -O0 -gencode arch=compute_20,code=sm_20 -odir "src" -M -o "src/CUDASample.d" "../src/CUDASample.cu" 
/Developer/NVIDIA/CUDA-6.5/bin/nvcc -G -g -O0 --compile --relocatable-device-code=false -gencode arch=compute_20,code=compute_20 -gencode arch=compute_20,code=sm_20 -x cu -o "src/CUDASample.o" "../src/CUDASample.cu" 
../src/CUDASample.cu(18): warning: variable "var" was set but never used 

../src/CUDASample.cu(8): warning: variable "WORK_SIZE" was declared but never referenced 

../src/CUDASample.cu(18): warning: variable "var" was set but never used 

../src/CUDASample.cu(8): warning: variable "WORK_SIZE" was declared but never referenced 

ptxas fatal : Unresolved extern function '_Z2k2i' 
make: *** [src/CUDASample.o] Error 255 

10:58:14 Build Finished (took 2s.388ms) 

उत्तर

6

मुद्दा यह है कि आप __global__ है कि यह कॉल से अलग संकलन इकाई में एक __device__ समारोह में परिभाषित किया गया है। आपको स्थानांतरित करने योग्य डिवाइस कोड मोड को स्पष्ट रूप से सक्षम करने की आवश्यकता है -dc ध्वज जोड़कर या अपनी परिभाषा को उसी इकाई में ले जाएं।

nvcc प्रलेखन से

:

--device-c|-dc संकलित प्रत्येक ग/.cc/सीपीपी/.cxx/.cu इनपुट एक वस्तु फ़ाइल कि पुनर्निधारणीय डिवाइस कोड होता है में फ़ाइल। यह --relocatable-device-code = सत्य --compile के बराबर है।

अधिक जानकारी के लिए Separate Compilation and Linking of CUDA C++ Device Code देखें।

+0

मैं बिल्डिंग प्रक्रिया के लिए नाइट का उपयोग कर रहा था। --relocatable-device-code = झूठा सेट किया गया था। मैंने इसे संशोधित किया, लेकिन यह तुरंत काम नहीं करता है। मैं कुछ और प्रयोग करूंगा। – max

+0

धन्यवाद, यह मेकफ़ाइल स्क्रिप्ट को संशोधित करने में काम करता है। – max

+2

nsight ईई में एक प्रोजेक्ट विकल्प है जिसका उपयोग आप प्रोजेक्ट बनाते समय "अलग संकलन" प्रोजेक्ट प्रकार का चयन करने के लिए कर सकते हैं। यदि आप इस तरह से प्रोजेक्ट बनाते हैं, तो मेकफ़ाइल स्क्रिप्ट को सीधे संशोधित करने से शायद यह आसान है। –

संबंधित मुद्दे