opencl初识

opencl执行流程

在这里插入图片描述

简单实例

// main.cpp
#define CL_HPP_ENABLE_EXCEPTIONS
#define CL_HPP_TARGET_OPENCL_VERSION 200
#include<CL/cl2.hpp>
#include <string.h>
#include <iostream>
#include <fstream>
#include <sstream>

int main()
{
	cl::Platform platforms = cl::Platform::getDefault();
	cl::Context context = cl::Context(CL_DEVICE_TYPE_GPU, NULL);

	cl_int errNum = CL_SUCCESS;
	std::vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>();
	cl::CommandQueue cq = cl::CommandQueue(context, devices[0], CL_QUEUE_PROFILING_ENABLE, &errNum);
	if (errNum != CL_SUCCESS) {
		std::cout << "error code " << errNum << std::endl;
		return -1;
	}

	std::ifstream kernelFile("main.cl", std::ios::in);
	std::ostringstream oss;
	oss << kernelFile.rdbuf();
	std::string srcStdStr = oss.str();
	const char* srcStr = srcStdStr.c_str();
	auto program = cl::Program(context, srcStr, false, &errNum);
	errNum = program.build(devices);

	auto kernel = cl::Kernel(program, "kernel_func", &errNum);

	if (errNum != CL_SUCCESS)
	{
		std::cout << "error in create kernel" << std::endl;
	}

	const int global_size = 2048;
	int a[global_size];
	int b[global_size];

	for (int i = 0; i < global_size; ++i)
	{
		a[i] = i + 1;
		b[i] = i + 1;
	}

	cl::Buffer mem_input_a(context, CL_MEM_USE_HOST_PTR, sizeof(cl_int) * global_size, a, &errNum);
	cl::Buffer mem_input_b(context, CL_MEM_USE_HOST_PTR, sizeof(cl_int) * global_size, b, &errNum);
	cl::Buffer mem_result = cl::Buffer(context, CL_MEM_WRITE_ONLY, sizeof(cl_int) * global_size, NULL, NULL);

	errNum = kernel.setArg(0, sizeof(cl_mem), &mem_input_a);
	errNum = kernel.setArg(1, sizeof(cl_mem), &mem_input_b);
	errNum = kernel.setArg(2, sizeof(cl_mem), &mem_result);

	errNum = cq.enqueueNDRangeKernel(kernel, cl::NDRange(0, 0), cl::NDRange(1024, 2), cl::NullRange, NULL, NULL);

	int* result = new int[global_size];
	errNum = cq.enqueueReadBuffer(mem_result, true, 0, sizeof(cl_int) * global_size, result, NULL, NULL);

	for (int i = 0; i < global_size; ++i)
		std::cout << result[i] << std::endl;

	delete[]result;
	system("pause");
	return 0;
}

//main.cl
__kernel void kernel_func(__global int* a, __global int* b, __global int* result)
{
	int index = get_global_id(0) + get_global_size(0) * get_global_id(1);
	result[index] = a[index] + b[index];
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值