kernel
在opencl中,一般最优价值的就是kernel,前面写的配置文件基本没有很大的差别,主要是kernel写法上。其中矩阵运算又是最能体现opencl价值的地方。先上写的kernel:
__kernel void matrix_mult(
const int Ndim,
const int Mdim,
const int Pdim,
__global const float* A,
__global const float* B,
__global float* C)
{
int i = get_global_id(0);
int j = get_global_id(1);
int k;
float tmp;
if ((i < Ndim) && (j < Mdim)) {
tmp = 0.0;
for (k = 0; k < Pdim; k++)
tmp += A[i*Pdim + k] * B[k*Mdim + j];
C[i*Mdim + j] = tmp;
}
}
上面的配置文件看起来简单其实已经包含了两方面的并行,首先是里面的乘法,这里是对所有的乘法可以进行并行。如果是M×P,P×N的矩阵,那么最多可以进行:M×N×P次乘法,如果没有超过GPU里面流媒体的处理器个数的话那么就可以同时执行,否者也只能满负荷运行。接着计算完这个之后就是加法的并行操作。用if是防止越界。
配置
在这里要特别说明的就是我们在传数据给从机的时候我们是传的一维数组,再通过传矩阵的维度来还原回二维数组。
配置文件的说明可以参考我之前的博客:请点击!
直接贴代码:
#include <CL/cl.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <fstream>
using namespace std;
#define NWITEMS 6
#pragma comment (lib,"OpenCL.lib")
//把文本文件读入一个 string 中
int convertToString(const char *filename, std::string& s)
{
size_t size;
char* str;
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(