나는 VHISTov의 답변과 다이어트를 통해 내 작업을 얻었습니다. 이 코드는 커널
typedef struct tag_my_struct{
int a;
char b;
}my_struct;
__kernel void myKernel(__global my_struct *myStruct)
{
int gid = get_global_id(0);
(myStruct+gid)->a = gid;
(myStruct+gid)->b = gid + 1;
}
호스트
typedef struct tag_my_struct{
cl_int a;
cl_char b;
}my_struct;
void runCode()
{
cl_int status = 0;
my_struct* ms = new my_struct[5];
cl_mem mem = clCreateBuffer(*context, 0, sizeof(my_struct)*5, NULL, &status);
clEnqueueWriteBuffer(*queue, mem, CL_TRUE, 0, sizeof(my_struct)*5, &ms, 0, NULL, NULL);
status = clSetKernelArg(*kernel, 0, sizeof(ms), &mem);
size_t global[] = {5};
status = clEnqueueNDRangeKernel(*queue, *kernel, 1, NULL, global, NULL, 0, NULL, NULL);
status = clEnqueueReadBuffer(*queue, mem, CL_TRUE, 0, sizeof(my_struct)*5, ms, 0, NULL, NULL);
for(int i = 0; i < 5; i++)
cout << (ms+i)->a << " " << (ms+i)->b << endl;
}
출력
0 ☺
,369
의 OpenCL 1.2에 나를 위해 작동
1 ☻
2 ♥
3 명 ♦
4 ♣
이 호스트 코드 (cl_int, cl_long, cl_float2 등)에 * 유형을 cl_를 사용하는 것이 좋습니다, 같은 크기 유형을 확인합니다. – dietr
@dietr "이 변수는 커널에 전달 될 예정이다"와 같이 코드 명료성에 도움이됩니다. – Thomas