OpenCl-work-itemの並列理解
2179 ワード
最近OpenCLのプログラムを見ていますが、work-itemの仕組みについてはよくわかりません.そこで、自分でいくつかの小さなプログラムで直感的に見て、主にOpenMPのテスト思想を使って、work-itemとその処理のデータの結果を出力します.個人的には、その実行メカニズムを理解するのに役立つと思います.以下はプログラムです.
ホスト側プログラム:main.cpp
kernel関数simpleMultiply.cl
実行結果:
上記の結果から、各work-itemが独立して動作していることがわかります.
ホスト側プログラム:main.cpp
/*
:openCL
:
:2012.11.20
*/
#include
#include
#include
#include
#include
#include
#include
using namespace std;
//kernel
std::string
convertToString(const char *filename)// kernel , ,
{
size_t size;
char* str;
std::string s;
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(0, std::fstream::beg);
str = new char[size+1];
if(!str)
{
f.close();
std::cout << "Memory allocation failed";
return NULL;
}
f.read(str, fileSize);
f.close();
str[size] = '\0';
s = str;
delete[] str;
return s;
}
else
{
std::cout << "
File containg the kernel code(\".cl\") not found. Please copy the required file in the folder containg the executable.
";
exit(1);
}
return NULL;
}
int main()
{
double start,end,time1,time2;
//
cl_int ciErrNum;
cl_platform_id platform;
ciErrNum = clGetPlatformIDs(1, &platform, NULL);
if(ciErrNum != CL_SUCCESS)
{
cout<
kernel関数simpleMultiply.cl
// Enter your kernel in this window
__kernel
void vecadd(__global float* B,__global float* C)
{
int id = get_global_id(0);
// barrier(CLK_LOCAL_MEM_FENCE);
B[id] = id;
for(int i =0;i<2;i++)
{
C[id*2+i] = i;
}
// barrier(CLK_LOCAL_MEM_FENCE);
};
実行結果:
上記の結果から、各work-itemが独立して動作していることがわかります.