The earlier blog-post was about how to use Qt Creator with OpenCL. The examples are all around Images, but nowhere a simple Hello World. So here it is: AMD’s infamous OpenCL Hello World in Qt. Thank’s to linuxjunk for glueing the parts together.
<span style="color: #000080;">
int main(int argc, char *argv[]) {
// Define the kernel. Take a good look what it does.
QByteArray prog(
"#pragma OPENCL EXTENSION cl_khr_byte_addressable_store : enablen"
"__constant char hw[] = "Hello World from Qt!"; n"
"__kernel void hello(__global char * out) {n"
" size_t tid = get_global_id(0); n"
" out[tid] = hw[tid]; n"
"}n"
);
// Get a context on the first available GPU.
QCLContext context;
if (!context.create(QCLDevice::GPU))
qFatal("Could not create OpenCL context");
// Allocate 100 bytes of memory on the Host.
size_t mem_size = 100;
char* outH = new char[mem_size];
// Allocate buffer on the Device.
QCLBuffer outCL = context.createBufferHost(outH, sizeof(char) * mem_size,
QCLMemoryObject::WriteOnly);
// Compile program against device
QCLProgram program = context.buildProgramFromSourceCode(prog);
// Create a kernel object, tell it we are using the kernel called "hello".
QCLKernel kernel = program.createKernel("hello");
// Set the necessary global memory. In this case it is the buffer-size.
kernel.setGlobalWorkSize(outCL.size(), 1);
// Turn on profiling.
QCLCommandQueue queue = context.commandQueue();
queue.setProfilingEnabled(true);
// Queue the kernel up to run.
// Give it an argument which is the memory we allocated above.
QCLEvent event = kernel(outCL);
// Use the event object above to block until processing has completed.
event.waitForFinished();
// Timing only works with profiling on. runTime is unsigned.
printf(" time '%u'n", event.runTime());
// Read the results out of the shared memory area.
outCL.read(outH, mem_size);
// Write to screen.
printf(" result = '%s'", outH);
}
</span>
Have fun!