欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

OpenCL 学习step by step (2) 一个简单的OpenCL的程序

程序员文章站 2024-01-06 14:55:40
...

现在,我们开始写一个简单的OpenCL程序,计算两个数组相加的和,放到另一个数组中去。程序用CPU和GPU分别计算,最后验证它们是否相等。OpenCL程序的流程大致如下: 下面是source code中的主要代码: int main(int argc, char* argv[]) { //在host内存中创建

现在,我们开始写一个简单的OpenCL程序,计算两个数组相加的和,放到另一个数组中去。程序用CPU和GPU分别计算,最后验证它们是否相等。OpenCL程序的流程大致如下:

OpenCL 学习step by step (2) 一个简单的OpenCL的程序

下面是source code中的主要代码:

int main(int argc, char* argv[])

{

//在host内存中创建三个缓冲区

float *buf1 = 0;

float *buf2 = 0;

float *buf = 0;

buf1 =(float *)malloc(BUFSIZE * sizeof(float));

buf2 =(float *)malloc(BUFSIZE * sizeof(float));

buf =(float *)malloc(BUFSIZE * sizeof(float));

//用一些随机值初始化buf1和buf2的内容

int i;

srand( (unsigned)time( NULL ) );

for(i = 0; i

buf1[i] = rand()%65535;

srand( (unsigned)time( NULL ) +1000);

for(i = 0; i

buf2[i] = rand()%65535;

//cpu计算buf1,buf2的和

for(i = 0; i

buf[i] = buf1[i] + buf2[i];

cl_uint status;

cl_platform_id platform;

//创建平台对象

status = clGetPlatformIDs( 1, &platform, NULL );

注意:如果我们系统中安装不止一个opencl平台,比如我的os中,有intel和amd两家opencl平台,用上面这行代码,有可能会出错,因为它得到了intel的opencl平台,而intel的平台只支持cpu,而我们后面的操作都是基于gpu,这时我们可以用下面的代码,得到AMD的opencl平台。

cl_uint numPlatforms;

std::string platformVendor;

status = clGetPlatformIDs(0, NULL, &numPlatforms);

if(status != CL_SUCCESS)

{

return 0;

}

if (0

{

cl_platform_id* platforms = new cl_platform_id[numPlatforms];

status = clGetPlatformIDs(numPlatforms, platforms, NULL);

char platformName[100];

for (unsigned i = 0; i

{

status = clGetPlatformInfo(platforms[i],

CL_PLATFORM_VENDOR,

sizeof(platformName),

platformName,

NULL);

platform = platforms[i];

platformVendor.assign(platformName);

if (!strcmp(platformName, "Advanced Micro Devices, Inc."))

{

break;

}

}

std::cout "Platform found : "

上一篇:

下一篇: