opencl的c++程序

#include <iostream>
#include <CL\cl.hpp>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<cl::Platform> platforms;
vector<cl::Device> platformDevices, allDevices, ctxDevices;
string device_name;
cl_uint i;


cl::Platform::get(&platforms);
platforms[0].getDevices(CL_DEVICE_TYPE_ALL, &platformDevices);
cl::Context context(platformDevices);
ctxDevices = context.getInfo<CL_CONTEXT_DEVICES>();
for (i = 0; i < ctxDevices.size(); i++)
{
device_name = ctxDevices[i].getInfo<CL_DEVICE_NAME>();
cout << "device:" << device_name.c_str() << endl;
}
system("pause");
return 0;

}

运行环境:vs2013和cuda7.5



===================================

刚刚又练习了第二个程序,计算简单的向量加法,基本上是仿造opencl编程指南上的例子。。。。

//#define __CL_ENABLE_EXCEPTIONS
#include<CL/cl.hpp>
#include<iostream>
#include<CL/cl.h>
char kernelSourceCode[] =
"__kernel void vadd(__global int * a,__global int * b,__global int * c)\n"
"{"
"size_t idx = get_global_id(0);"
"c[idx]=a[idx]*b[idx];"
"}"
;
#define BUFFER_SIZE 100
int main()
{
std::vector<cl::Platform> platforms;
cl::Platform::get(&platforms);
cl_context_properties cprops[] = { CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[2])(), 0 };
cl::Context context(CL_DEVICE_TYPE_GPU, cprops);
std::vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>();
cl::CommandQueue queue(context, devices[0], 0);
cl::Program::Sources sources(1, std::make_pair(kernelSourceCode, 0));
cl::Program program(context, sources);
program.build(devices);
cl::Kernel kernel(program, "vadd");

int A[100] = { 3 };
int B[100] = { 2 };
int C[100] = { 8 };
for (int i = 0; i < BUFFER_SIZE; i++)
{
A[i] = 5;
B[i] = 4;
C[i] = 2;
}
cl::Buffer aBuffer = cl::Buffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, BUFFER_SIZE*sizeof(int), (void *)&A[0]);
cl::Buffer bBuffer = cl::Buffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, BUFFER_SIZE*sizeof(int), (void *)&B[0]);
cl::Buffer cBuffer = cl::Buffer(context, CL_MEM_WRITE_ONLY | CL_MEM_USE_HOST_PTR, BUFFER_SIZE*sizeof(int), (void *)&C[0]);
kernel.setArg(0, aBuffer);
kernel.setArg(1, bBuffer);
kernel.setArg(2, cBuffer);
queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(BUFFER_SIZE), cl::NullRange);
int * output = (int *)queue.enqueueMapBuffer(cBuffer, CL_TRUE, CL_MAP_READ, 0, BUFFER_SIZE*sizeof(int));
for (int i = 0; i < BUFFER_SIZE; i++)
std::cout << C[i] << " ";
int err = queue.enqueueUnmapMemObject(cBuffer, (void *)output);


system("pause");
return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值