2015-10-14 83 views
1

我可以使用struct作爲OpenCL內核參數嗎?OpenCL:使用struct作爲內核參數

我想用結構類型的OpenCL內核參數在NVIDIA的OpenCL 1.2(NVIDIA驅動程序352.39)

我試過了,但它使CL_OUT_OF_RESOURCE錯誤。

我的代碼有什麼問題?

[爲結構定義]

/* struct type definition */ 
typedef struct _st_foo 
{ 
    int aaa; 
    int bbb; 
    ..... 
    int zzz; 
}st_foo;  // st_foo doesn't have any pointer members 

[主持人代碼]

/* OpenCL initalize... */ 

st_foo stVar; 

cl_mem cm_buffer; 
cm_buffer = clCreateBuffer(cxContext, CL_MEM_READ_ONLY, sizeof(st_foo), NULL, NULL); 
clSetKernelArg(ckKernel, 0, sizeof(cl_mem), (void*)&cm_buffer); 
clEnqueueWriteBuffer(cqueue, cm_buffer, CL_TRUE, 0, sizeof(st_foo), &stVar, 0, NULL, NULL); 

[內核代碼]

__kernel void testfunction(__global const st_foo *stVar) 
{ 
    printf("stVar->aaa=%d\n", stVar->aaa); 
} 

回答

5

這是不是安全的,如果你是在OpenCL的聲明結構不使用OpenCL數據類型。而且,對齊可能是一個問題,在主機/設備編譯器中強制數據包對齊。

你應該申報的結構爲:

[主持人]

typedef struct __attribute__ ((packed)) _st_foo 
{ 
    cl_int aaa; 
    cl_int bbb; 
    ..... 
    cl_int zzz; 
}st_foo; 

[設備]

typedef struct __attribute__ ((packed)) _st_foo 
{ 
    int aaa; 
    int bbb; 
    ..... 
    int zzz; 
}; 

的方法,另外,如果你只想要一個單一的參數,而不是結構的數組,那麼只需將其傳入:

clSetKernelArg(ckKernel, 0, sizeof(mystruct), mystruct); 
+0

我試圖傳入一個結構作爲非指針值,我無法構建內核。 你確定靜態對象被允許作爲內核參數嗎? –

+0

不是緩衝區的內核參數(即:非指針,整數,結構體等)可以作爲參數直接傳遞。只要設備中有足夠的可用內存來保持該結構。 – DarkZeros