OpenCl-work-itemの並列理解


最近OpenCLのプログラムを見ていますが、work-itemの仕組みについてはよくわかりません.そこで、自分でいくつかの小さなプログラムで直感的に見て、主にOpenMPのテスト思想を使って、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が独立して動作していることがわかります.