2012-09-03 24 views
4

我剛開始學習一些關於OpenCL的基礎知識,並決定給予Apple的"Basic programming sample"一個去。我運行在CPU OK,但是當我從來自Apple的OpenCL的基本編程樣例無法在GPU上運行

err = gclExecKernelAPPLE(k, ndrange, &kargs);

選擇GPU作爲目標設備,我得到ERR = -45此錯誤代碼轉換爲CL_INVALID_PROGRAM_EXECUTABLE。任何想法如何糾正示例代碼?

自動生成kernel.cl.c代碼看起來像這樣(+包括頂部):

static void initBlocks(void); 

// Initialize static data structures 
static block_kernel_pair pair_map[1] = { 
    { NULL, NULL } 
}; 

static block_kernel_map bmap = { 0, 1, initBlocks, pair_map }; 

// Block function 
void (^square_kernel)(const cl_ndrange *ndrange, cl_float* input, cl_float* output) = 
^(const cl_ndrange *ndrange, cl_float* input, cl_float* output) { 
    int err = 0; 
    cl_kernel k = bmap.map[0].kernel; 
    if (!k) { 
     initBlocks(); 
     k = bmap.map[0].kernel; 
    } 
    if (!k) 
     gcl_log_fatal("kernel square does not exist for device"); 
    kargs_struct kargs; 
    gclCreateArgsAPPLE(k, &kargs); 
    err |= gclSetKernelArgMemAPPLE(k, 0, input, &kargs); 
    err |= gclSetKernelArgMemAPPLE(k, 1, output, &kargs); 
    gcl_log_cl_fatal(err, "setting argument for square failed"); 

    err = gclExecKernelAPPLE(k, ndrange, &kargs); 

    gcl_log_cl_fatal(err, "Executing square failed"); 
    gclDeleteArgsAPPLE(k, &kargs); 
}; 

// Initialization functions 
static void initBlocks(void) { 
    const char* build_opts = " -cl-std=CL1.1"; 
    static dispatch_once_t once; 
    dispatch_once(&once, 
    ^{ int err = gclBuildProgramBinaryAPPLE("OpenCL/kernel.cl", "", &bmap, build_opts); 
     if (!err) { 
      assert(bmap.map[0].block_ptr == square_kernel && "mismatch block"); 
      bmap.map[0].kernel = clCreateKernel(bmap.program, "square", &err); 
     } 
    }); 
} 

__attribute__((constructor)) 
static void RegisterMap(void) { 
    gclRegisterBlockKernelMap(&bmap); 
    bmap.map[0].block_ptr = square_kernel; 
} 
+0

我假設您正在使用GPU創建隊列,但是此GPU是否支持openCL? – kiranputtur

+0

是的,使用GPU創建隊列,是的,GPU支持opencl(ATI HD6750M)。事實上,它使用非蘋果方法時正常運行。我只想知道爲什麼「官方」方式失敗? – bor

+0

如果您未通過構建選項,即build_opts =「-cl-std = CL1.1」...,那麼行爲如何?你仍然得到這個錯誤? – kiranputtur

回答

1

我10.7.3下運行時看到這個相同的問題,而在10.7.5機器正常工作。我注意到在每次調用我的應用程序後,CVMCompiler進程都崩潰了。

檢查堆棧跟蹤,我發現當試圖解析編譯爲本地代碼的位代碼時,它崩潰了。由於位碼分析失敗失敗,因此沒有得到編譯的程序gclExecKernelAPPLE()執行,因此錯誤。

嘗試升級到10.7.5或甚至10.8,問題應該消失。 (我只是測試了這個,它確實解決了這個問題。)

+0

感謝您的輸入! – bor

+0

也許你可以在升級後測試代碼,並且如果它解決了問題,可以提出答案。否則,讓我們知道它是否仍然無效。 – gavinb

+1

別擔心Gavinb我會在時間允許的情況下做到這一點。現在我太忙了,不能檢查這是否能解決我的問題,但一旦我對此有更多瞭解,就會回到這裏。 – bor