DSP

opencl的c++程序

2019-07-13 19:47发布

#include
#include
#include
#include
using namespace std;
int main()
{
vector platforms;
vector 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();
for (i = 0; i < ctxDevices.size(); i++)
{
device_name = ctxDevices[i].getInfo();
cout << "device:" << device_name.c_str() << endl;
}
system("pause");
return 0;
} 运行环境:vs2013和cuda7.5

=================================== 刚刚又练习了第二个程序,计算简单的向量加法,基本上是仿造opencl编程指南上的例子。。。。 //#define __CL_ENABLE_EXCEPTIONS
#include
#include
#include
char kernelSourceCode[] =
"__kernel void vadd(__global int * a,__global int * b,__global int * c) "
"{"
"size_t idx = get_global_id(0);"
"c[idx]=a[idx]*b[idx];"
"}"
;
#define BUFFER_SIZE 100
int main()
{
std::vector 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 devices = context.getInfo();
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;
}