栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

opencl初识

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

opencl初识

opencl执行流程

简单实例
// main.cpp
#define CL_HPP_ENABLE_EXCEPTIONS
#define CL_HPP_TARGET_OPENCL_VERSION 200
#include
#include 
#include 
#include 
#include 

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 devices = context.getInfo();
	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];
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/657219.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号