opencl初尝试

注意context创建时的参数设置到底是CL_DEVICE_TYPE_GPU还是CL_DEVICE_TYPE_CPU,也即是当前所使用的设备类型

#include <iostream>

#if defined(__APPLE__) || defined(__MACOSX)
#include <OpenCL/cl.hpp>
#else
#include <CL/cl.h>
#endif

#pragma comment(lib, "OpenCL.lib")

#define KERNEL(...)#__VA_ARGS__
const char *
kernelSourceCode = KERNEL(

__kernel void hellocl(__global uint *buffer)
{
size_t gidx = get_global_id(0);
size_t gidy = get_global_id(1);
size_t lidx = get_local_id(0);
buffer[gidx + 4 * gidy] = (1<<gidx)|(0x10<<gidy);
});

int main()
{
printf("hello OpenCL\n");
cl_int status = 0;
size_t deviceListSize;

cl_uint numPlatforms;
cl_platform_id platform = NULL;
status = clGetPlatformIDs(0, NULL, &numPlatforms);
if(status != CL_SUCCESS)
{
printf("Error: Getting Platforms.\
(clGetPlatformsIDs)\n");
return EXIT_FAILURE;
}

if(numPlatforms > 0)
{
cl_platform_id *platforms = (cl_platform_id*)malloc(numPlatforms*sizeof(cl_platform_id));
status = clGetPlatformIDs(numPlatforms, platforms, NULL);
if(status != CL_SUCCESS)
{
printf("Error: Getting Platform Ids.\
(clGetPlatformsIDs)\n");
return -1;
}
for(unsigned int i = 0; i < numPlatforms; ++i)
{
char pbuff[100];
status = clGetPlatformInfo(
platforms[i],
CL_PLATFORM_VENDOR,
sizeof(pbuff),
pbuff,
NULL);
platform = platforms[i];
if(!strcmp(pbuff, "Advanced Micro Devices,Inc."))
{
break;
}
}
delete platforms;
}


cl_context_properties cps[3] = {
CL_CONTEXT_PLATFORM,
(cl_context_properties)platform, 0};
cl_context_properties *cprops = (NULL == platform) ? NULL : cps;


cl_context context = clCreateContextFromType(
cprops,
CL_DEVICE_TYPE_GPU,
NULL,
NULL,
&status);
if(status != CL_SUCCESS)
{
printf("Error: Creating Context.\
(clCreateContextFromType)\n");
return EXIT_FAILURE;
}



status = clGetContextInfo(context,
CL_CONTEXT_DEVICES,
0,
NULL,
&deviceListSize);
if(status != CL_SUCCESS)
{
printf("Error: Getting Context Info \
(device list size,clGetContextInfo)\n");
return EXIT_FAILURE;
}
cl_device_id *devices = (cl_device_id *)malloc(deviceListSize);
if(devices == 0)
{
printf("Error: No devices found.\n");
return EXIT_FAILURE;
}


status = clGetContextInfo(
context,
CL_CONTEXT_DEVICES,
deviceListSize,
devices,
NULL);
if(status != CL_SUCCESS)
{
printf("Error: Getting Context Info \
(device list, clGetContextInfo)\n");
return EXIT_FAILURE;
}


size_t sourceSize[] = {strlen(kernelSourceCode)};
cl_program program = clCreateProgramWithSource(
context,
1,
&kernelSourceCode,
sourceSize,
&status);
if(status != CL_SUCCESS)
{
printf("Error: Loading Binary into cl_program \
(clCreateProgramWithBinary)\n");
return EXIT_FAILURE;
}


status = clBuildProgram(program, 1, devices, NULL, NULL, NULL);
if(status != CL_SUCCESS)
{
printf("Error: Building Program \
(clBuildProgram)\n");
return EXIT_FAILURE;
}

cl_kernel kernel = clCreateKernel(program, "hellocl", &status);
if(status != CL_SUCCESS)
{
printf("Error: Creating Kernel from program.\
(clCreateKernel)\n");
return EXIT_FAILURE;
}


cl_command_queue commandQueue = clCreateCommandQueue(context, devices[0], 0, &status);
if(status != CL_SUCCESS)
{
printf("Creating Command Queue.\
(clCreatCommandQueue)\n");
return EXIT_FAILURE;
}


unsigned int *outbuffer = new unsigned int [4 * 4];
memset(outbuffer, 0, 4 * 4 * 4);
cl_mem outputBuffer = clCreateBuffer(
context,
CL_MEM_ALLOC_HOST_PTR,
4 * 4 * 4,
NULL,
&status);
if(status != CL_SUCCESS)
{
printf("Error: clCreateBuffer \
(outputBuffer)\n");
return EXIT_FAILURE;
}

status = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void*)&outputBuffer);
if(status != CL_SUCCESS)
{
printf("Error: Setting kernel argument.\
(output)\n");
return EXIT_FAILURE;
}

size_t globalThreads[] = {4, 4};
size_t localThreads[] = {2, 2};
status = clEnqueueNDRangeKernel(
commandQueue, kernel, 2, NULL, globalThreads,
localThreads, 0, NULL, NULL);
if(status != CL_SUCCESS)
{
printf("Error: Enqueueing kernel\n");
return EXIT_FAILURE;
}
status = clFinish(commandQueue);
if(status != CL_SUCCESS)
{
printf("Error: Finish command queue\n");
return EXIT_FAILURE;
}
status = clEnqueueReadBuffer(commandQueue, outputBuffer, CL_TRUE, 0, 4 * 4 * 4, outbuffer, 0, NULL, NULL);
if(status != CL_SUCCESS)
{
printf("Error: Read Buffer queue\n");
return EXIT_FAILURE;
}
printf("out:\n");
for(int i = 0; i < 16; i++)
{
printf("%x ", outbuffer[i]);
if((i + 1) % 4 == 0)
{
printf("\n");
}
}

status = clReleaseKernel(kernel);
status = clReleaseProgram(program);
status = clReleaseMemObject(outputBuffer);
status = clReleaseCommandQueue(commandQueue);
status = clReleaseContext(context);
free(devices);
delete outbuffer;
system("pause");
return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值