opencl矩阵点乘运算及遇到的问题总结
来源:互联网 发布:认真对待权利 知乎 编辑:程序博客网 时间:2024/04/28 18:41
matvec
#define PROGRAM_FILE "matvec.cl"#define KERNEL_FUNC "matvec_mult"#include <stdio.h>#include<stdlib.h>#include <string.h>#include<sys/types.h>#include <CL/cl.h>int main(){cl_platform_id platform;cl_device_id device;cl_context context;cl_command_queue queue;cl_int i,err;cl_program program;FILE* program_handle;char* program_buffer,*program_log; size_t program_size,log_size;cl_kernel kernel;size_t work_units_per_kernel;float mat[16],vec[4],result[4];//计算矩阵乘法的因子及最后的结果float correct[4] = {0.0f,0.0f,0.0f,0.0f};cl_mem mat_buff,vec_buff,res_buff;//内核参数for(i = 0;i<16;i++){mat[i]=i*2.0f;}for(i=0;i<4;i++){vec[i]=i*3.0f;correct[0]+=mat[i]*vec[i];correct[1]+=mat[i+4]*vec[i];correct[2]+=mat[i+8]*vec[i];correct[3]+=mat[i+12]*vec[i];}//配置平台,配置上下文clGetPlatformIDs(1,&platform,NULL);clGetDeviceIDs(platform,CL_DEVICE_TYPE_GPU,1,&device,NULL);context = clCreateContext(NULL,1,&device,NULL,NULL,&err);//读取程序文件program_handle = fopen(PROGRAM_FILE,"r");fseek(program_handle,0,SEEK_END);program_size = ftell(program_handle);rewind(program_handle);program_buffer = (char*)malloc(program_size+1);program_buffer[program_size] = '\0';fread(program_buffer,sizeof(char),program_size,program_handle);fclose(program_handle);//编译程序program = clCreateProgramWithSource(context,1,(const char**)&program_buffer,&program_size,&err);free(program_buffer);//创建内核队列clBuildProgram(program,0,NULL,NULL,NULL,NULL);//创建内核队列kernel = clCreateKernel(program,KERNEL_FUNC,&err);queue = clCreateCommandQueue(context,device,0,&err);//设置内核参数mat_buff = clCreateBuffer(context,CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,sizeof(float)*16,mat,&err);vec_buff = clCreateBuffer(context,CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,sizeof(float)*4,vec,&err);res_buff = clCreateBuffer(context,CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,sizeof(float)*4,vec,&err);clSetKernelArg(kernel,0,sizeof(cl_mem),&mat_buff);clSetKernelArg(kernel,1,sizeof(cl_mem),&vec_buff);clSetKernelArg(kernel,2,sizeof(cl_mem),&res_buff);work_units_per_kernel = 4;clEnqueueNDRangeKernel(queue,kernel,1,NULL,&work_units_per_kernel,NULL,0,NULL,NULL);clEnqueueReadBuffer(queue,res_buff,CL_TRUE,0,sizeof(float)*4,result,0,NULL,NULL);if(result[0]==correct[0]&&result[1]==correct[1]&&result[2]==correct[2]&&result[3]==correct[3]){printf("Matrix-vector multiplication successful.\n");}else{printf("Matrix-vector multiplication unsuccessful.\n");}clReleaseMemObject(res_buff);clReleaseMemObject(vec_buff);clReleaseMemObject(mat_buff);clReleaseKernel(kernel);clReleaseCommandQueue(queue);clReleaseProgram(program);clReleaseContext(context);system("pause");return 0;}
matvec.cl
__kernel void matvec_mult(__global float4* matrix,__global float4* vector,__global float* result){ int i = get_global_id(0); result[i] = dot(matrix[i],vector[0]);}注意在VS下保存.cl文件时要把高级保存选项选为 unicode-8 unix(LF)
0 0
- opencl矩阵点乘运算及遇到的问题总结
- 矩阵的点乘与叉乘
- GSL 矩阵乘运算及逆运算
- OpenCl加速矩阵运算
- 矩阵的乘法和点乘
- 基于Opencv的 矩阵点乘
- 矩阵的乘法和点乘
- dot--向量或矩阵的点乘
- Mat 矩阵的叉乘与点乘
- java通过矩阵类实现矩阵的加减乘运算
- OpenCL的学习---矩阵转置问题及用FreeImage保存灰度图
- 点乘,叉乘总结
- 矩阵连乘问题的算法分析
- 矩阵连乘问题的java实现
- 基于DP的矩阵连乘问题
- 矩阵点乘和叉乘
- Opencv Mat矩阵点乘
- 矩阵连乘问题
- POJ 3617 Best Cow Line
- 湘潭XXX项目(php)总结
- 有一个奇奇怪怪的发现,关于OJ测评时间
- nginx源码分析笔记1
- 黑马程序员_Java_Map
- opencl矩阵点乘运算及遇到的问题总结
- 鸟哥的私房菜基础篇--第一部分 读书笔记
- windows下eclipse android-ndkr7b 环境配置
- 百度地图开发(二)之添加覆盖物 + 地理编码和反地理编码
- LeetCode[Graph]: Clone Graph
- mybatis通过传bean的方式来得到存储过程中游标的值list
- openwrt 编译出错
- 想成为好的程序员?写博客吧
- App如何适应 iPhone 5s/6/6 Plus 三种屏幕的尺寸?