Как да отпечатате резултати от ядрото в OpenCL?

Нов съм в OpenCL. Опитвам се да използвам езиковото разширение на ядрото OpenCL c++ http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/CPP_kernel_language.pdf. Опитвам се да отпечатам резултати, като използвам кода на страница 10 от този документ. Моля, намерете кода по-долу от тази документация и ме поправете, ако греша някъде.

class Test{
public:
    void setX(int value){ x = value;}
    int getX(){ return x;}
private:
    int x;
};

int main() {
    cl_mem classObj = clCreateBuffer(context, CL_MEM_USE_HOST_PTR, sizeof(Test), &tempClass, &ret);
    void* dm_idata = clEnqueueMapBuffer(command_queue, classObj, CL_TRUE, CL_MAP_WRITE, 0 , sizeof(Test), 0, NULL, NULL, &ret);
    tempClass.setX(10); //prints this value
    clEnqueueUnmapMemObject(command_queue, classObj, dm_idata, 0, NULL, NULL);//class is passed to the device
    ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, &global_item_size, &local_item_size, 0, NULL, NULL);
    clEnqueueMapBuffer(command_queue, classObj, CL_TRUE, CL_MAP_WRITE, 0, sizeof(Test), 0, NULL, NULL, &ret);//class is passed back to the host
    printf("\n temp value: %d\n", tempClass.getX());
}

Ето кода на ядрото.

class Test {
    setX (int value);
private:
     int x;
};

__kernel void foo(__global Test* Inclass){   

if(get_global_id(0) == 0)
    Inclass->setX(6);
}

Той отпечатва стойността от хост кода. Трябва да получа резултата от ядрото. Всяка помощ е високо оценена.

Резултатът, който получих е

стойност на температурата = 10


person Trisha J    schedule 28.11.2014    source източник


Отговори (1)


Второто ви обаждане до clEnqueueMapBuffer трябва да предава CL_MAP_READ, а не CL_MAP_WRITE, тъй като искате да прочетете данните.

person jprice    schedule 28.11.2014
comment
Благодаря за вашия отговор. Пропуснах и един друг параметър -x clc++, както е обяснено в този url (devgurus.amd.com/message/1280376). - person Trisha J; 28.11.2014