我剛開始學習一些關於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;
}
我假設您正在使用GPU創建隊列,但是此GPU是否支持openCL? – kiranputtur
是的,使用GPU創建隊列,是的,GPU支持opencl(ATI HD6750M)。事實上,它使用非蘋果方法時正常運行。我只想知道爲什麼「官方」方式失敗? – bor
如果您未通過構建選項,即build_opts =「-cl-std = CL1.1」...,那麼行爲如何?你仍然得到這個錯誤? – kiranputtur