0

テキストファイルの行、行の長さ、読み取った行の量をロードし、正しい方法でキャストして GPU に渡す方法は?

意味:

入力テキスト ファイル:

Line1
Line2
..
LineN

app.cl

#define UP_LIMIT 256

typedef struct {
  uint bar; // amount of read lines
} foomatic;

typedef struct {
   uint len; // length of line
   uchar s[UP_LIMIT]; // line
} foo;

__kernel foobar(__global foo * kernel_in, __global foomatic kernel_in2){
 // do something
}

main.cpp

#define LLEN 256
typedef struct {
   cl_uint bar; // amount of read lines
} foomatic;
typedef struct {
   cl_uint len; // length of line
   cl_uchar s[LLEN]; // line
} foo;
int main(){
// load from file
// count lines of file
foo * input = new foo[N]; // N is the amount of lines of source text file
// cast line to cl_uchar

// pass lines, their lengths and number of lines to ocl kernel
delete [] input;    
}
4

1 に答える 1

0

フィールドが CPU とデバイスで異なる方法でパックされる可能性があるため、OpenCL で構造体を使用するのは難しいようです。また、メモリ アクセスをグループ化する機能に影響するため、GPU では効率的ではありません。より良いアプローチは、複数の配列を使用することです。私は次のようなものを持っています:

//N is the number of strings.
cl_uint* strlens = new cl_uint[N];
cl_uchar* input = new cl_uchar[N * LLEN];
cl_int err_code = CL_SUCCESS;
//Remember to check error codes, omitted here for convenience.
cl_mem strlens_buffer = clCreateBuffer(context, CL_MEM_READ_ONLY, N*sizeof(cl_uint), NULL, &err_code);
cl_mem input_buffer = clCreateBuffer(context, CL_MEM_READ_ONLY, N*LLEN*sizeof(cl_uchar), NULL, &err_code);

//Some initialisation code...

//Send to device.
err_code = clEnqueueWriteBuffer(queue, strlens_buffer, CL_TRUE, 0, N*sizeof(cl_uint), strlens, 0, NULL, NULL);
err_code = clEnqueueWriteBuffer(queue, input_buffer, CL_TRUE, 0, N*LLEN*sizeof(cl_uchar), 0 NULL, NULL);

//Send work to the GPU...

//Clean up.
delete[] strlens;
delete[] input;

デバイスに関連付けられた OpenCL コンテキストと、そのコンテキストに関連付けられたコマンド キューに context と queue を使用しました。

于 2013-07-13T20:08:16.737 に答える