openCL实现计算自然对数

这篇博客主要介绍了如何利用OpenCL实现自然对数的计算,通过两种不同的方法进行阐述,包括主机端代码和kernel函数的实现,旨在探讨并行语言OpenCL的特点。
摘要由CSDN通过智能技术生成


主要是之前老师让不同的方法实现计算自然对数,了解不同并行语言的特点。所以在用了多线程,openMP后,想用opencL实现以下,先介绍一下算法

 

 

方法一.

 代码主机端

/*
   项目:openCL的矩阵相乘
   作者:刘荣
   时间:2012.11.20
*/
#include <iostream>
#include<time.h>
#include <string> 
#include<math.h>
#include <vector>
#include <CL/cl.h>
#include <fstream>
using namespace std;
//kernel函数
std::string
convertToString(const char *filename)//将kernel源码,即自己写的并行化的函数,转化成字符串
{
    size_t size;
    char*  str;
    std::string s;

    std::fstream f(filename, (std::fstream::in | std::fstream::binary));

    if(f.is_open())
    {
        size_t fileSize;
        f.seekg(0, std::fstream::end);
        size = fileSize = (size_t)f.tellg();
        f.seekg(0, std::fstream::beg);

        str = new char[size+1];
        if(!str)
        {
            f.close();
            std::cout << "Memory allocation failed";
            return NULL;
        }

        f.read(str, fileSize);
        f.close();
        str[size] = '\0';
    
        s = str;
        delete[] str;
        return s;
    }
    else
    {
        std::cout << "\nFile containg the kernel code(\".cl\") not found. Please copy the required file in the folder containg the executable.\n";
        exit(1);
    }
    return NULL;
}

int main()
{
	//
	double start,end,time1,time2;
	//查询平台
	cl_int ciErrNum;
	cl_platform_id platform;
	ciErrNum = clGetPlatformIDs(1, &platform, NULL);
	if(ciErrNum != CL_SUCCESS)
	{
		cout<<"获取设备失败"<<endl;
		return 0;
	}
	//获取设备信息
	cl_device_id device;
	cl_int   status;
    cl_uint maxDims;
    cl_event events[3];
    size_t globalThreads[1];
    size_t localThreads[1];
    size_t maxWorkGroupSize;
    size_t maxWorkItemSizes[3];
  //创建设备
	ciErrNum = clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, 1, &device, NULL);
  
	
	//创建上下文
	cl_context_properties cps[3] = {CL_CONTEXT_PLATFORM, (cl_context_properties)platform, 0};
	cl_context ctx = clCreateContext(cps, 1, &device, NULL, NULL, &ciErrNum);
	if(ciErrNum != CL_SUCCESS)
	{
		cout<<"创建上下文失败"<<endl;
		return 0;
	}
	cl_command_queue myqueue = clCreateCommandQueue(ctx,device,0,&ciErrNum);
	if(ciErrNum != CL_SUCCESS)
	{
		cout<<"命令队列失败"<<endl;
		return 0;
	}
	//声明buffer,传输数据
	double *C = NULL; // 输出数组
	int Max
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值