2015-07-10 4 views
5

मैंने ओपनक्ल के साथ एक प्रोजेक्ट लागू किया है, तो recompile नहीं करता है। मेरे पास एक फ़ाइल है जिसमें कर्नेल फ़ंक्शन और कर्नेल द्वारा उपयोग किए जाने वाले फ़ंक्शंस को एक अलग शीर्षलेख फ़ाइल में शामिल किया गया है, लेकिन जब मैं फ़ाइल को शामिल करता हूं, तो कभी-कभी परिवर्तन लागू होते हैं और कभी-कभी वे नहीं होते हैं और यह मुझे भ्रमित कर देता है अगर आवेदन में बग है या नहीं।ओपनसीएल clBuildProgram कैश स्रोत, और # शामिल स्रोत स्रोत

मैंने स्टैक ओवरफ्लो में अन्य पोस्ट की जांच की है और -I{include directory} पास करने के साथ एनवीडिया को गंभीर समस्या है, इसलिए मैंने इसे बदल दिया और हेडर फाइल पता स्पष्ट रूप से दिया, लेकिन फिर भी ओपनक्ल कंपाइलर हेडर फ़ाइल में त्रुटियों को ढूंढने में सक्षम नहीं है कर्नेल फ़ाइल नाम में शामिल है।

इसके अलावा, मैं एनवीडिया gtx 980 का उपयोग कर रहा हूं और मैंने अपने कंप्यूटर पर CUDA 7.0 को घुमाया है।

किसी के पास भी वही अनुभव है? मेरे द्वारा यह कैसे किया जा सकता है?

तो, मान लें मैं इस तरह एक गिरी है:

#include "../../src/cl/test_kernel_include.cl" 

void __kernel test_kernel(
    __global int* result, 
    int n 
) 
{ 
    int thread_idx = get_global_id(0); 
    result[thread_idx] = test_func(); 
} 

जो test_kernel_include.cl इस प्रकार है:

int test_func() 
{ 
    return 1; 
} 

तब मैं कोड चलाने के लिए और मैं एक सरणी है जो सभी सदस्य हैं मिलता है जैसा कि हम उम्मीद करते हैं 1 के बराबर। अब, मैं बदल test_kernel_include.cl रहे हैं:

int test_func() 
{ 
    return 2; 
} 

लेकिन परिणाम अभी भी एक सरणी जो सभी सदस्यों 1 के बराबर जो 2 में बदल जानी चाहिए, लेकिन वे नहीं कर रहे हैं है।

उत्तर

6

कर्नेल संकलन के समय को बेहतर बनाने के लिए, एनवीआईडीआईए एक कैशिंग योजना लागू करता है, जिससे एक संकलित कर्नेल बाइनरी डिस्क पर संग्रहीत होती है और अगली बार उसी कर्नेल को संकलित किया जाता है। कुछ हैश को कर्नेल स्रोत कोड पर गणना की जाती है जिसे तब संकलित कर्नेल कैश में इंडेक्स के रूप में उपयोग किया जाता है।

दुर्भाग्यवश, इन हैंश में मुख्य कर्नेल स्रोत द्वारा शामिल किसी भी शीर्षलेख फ़ाइलों को शामिल नहीं किया गया है। इसका अर्थ यह है कि जब आप किसी हेडर फ़ाइल में कुछ बदलते हैं, तो ड्राइवर अनिवार्य रूप से परिवर्तन को अनदेखा कर देगा और पिछले कर्नेल बाइनरी को डिस्क से पुनः लोड करेगा (जब तक कि मुख्य कर्नेल स्रोत में कुछ भी नहीं बदला जाता)।

लिनक्स सिस्टम पर, कर्नेल कैश ~/.nv/ComputeCache में पाया जा सकता है। यदि आप अपनी फ़ाइलों में से किसी एक में परिवर्तन करने के बाद इस निर्देशिका को हटाते हैं, तो इसे ड्राइवर को ओपनसीएल कर्नेल को वास्तव में पुन: संकलित करने के लिए मजबूर होना चाहिए।

+0

इसके अलावा, विंडोज़ में यह '% AppData% \ NVIDIA \ ComputeCache' पाया जा सकता है। क्या यह बेवकूफ चीज एएमडी और इंटेल पर भी लागू होती है या यह एनवीडिया कंपाइलर के लिए विशिष्ट है? – mmostajab

+1

मैंने केवल एनवीआईडीआईए के साथ इस समस्या को देखा है। अन्य कैशिंग योजनाओं को भी लागू कर सकते हैं, लेकिन शायद वे हेडर्स को शामिल करते हैं। – jprice

+0

मैंने दृश्य स्टूडियो में अपने प्रीबिल्ड इवेंट में 'डेल/क्यू/एस% एपडाटा%% \ NVIDIA \ ComputeCache * 'जोड़ा है, अब यह एप्लिकेशन को चलाने से पहले हमेशा कंपाइलर के कैश को हटा रहा है :) – mmostajab

8

मंच सक्रियण से पहले यह करें:

setenv("CUDA_CACHE_DISABLE", "1", 1); 

इसे बनाने के लिए कैशिंग तंत्र को निष्क्रिय कर देगा। यह ओपनसीएल मंच के लिए भी काम करता है, भले ही यह क्यूडीए कहता है।

+0

क्या यह विंडोज़ में भी काम कर रहा है? क्योंकि मैंने कोशिश की लेकिन 'setenv' परिभाषित नहीं किया गया था। – mmostajab

+2

@mmostajab विंडोज समकक्ष '_putenv_s (" CUDA_CACHE_DISABLE "," 1 ") होगा;' – jprice