私はここ数週間、c/C++ OpenCLソリューションを開発しています。私の解決策として、CPU(ホスト)からGPU(デバイス)にクラスを渡す必要があります。クラスを引数として渡そうとすると、 "Unknown Type-Identifier Class"というエラーが返されます。私が疑問に思うのは、インテルPlatform上のOpenCLがクラスをカーネルに渡すことを許可するのか、それとも回避することができるのかという疑問です。 CUDAでは、いくつかの例を見てきましたが、プラットフォームにとっては問題なく動作します。しかし、OpenCLに関しては、私はこの照会に関連する参考文献も例も見つけられません。この問題に関して私は本当に感謝しています。私はIntelのWebサイトに同じ質問を掲載しましたが、無駄です。誰かが私がどこに間違っているのか、これをどのように進めるべきかを理解する助けになるほど親切であれば、本当に感謝しています。Intel Openclのカーネルにクラスを渡す
// HOST側のコード
#include<stdio.h>
#include<iostream>
#include"CL/cl.h"
class test
{
public:
cl_int a;
cl_char b;
};
int main()
{
test *tempstruct = new test;
cl_platform_id platfrom_id;
cl_device_id device_id; // compute device id
cl_context context; // compute context
cl_command_queue commands; // compute command queue
cl_program program; // compute program
cl_kernel kernel; // compute kernel
int err;
err = clGetPlatformIDs(1, &platfrom_id, NULL);
if (err != CL_SUCCESS)
{
printf("Error: Failed to create a platfrom group!\n");
return -1;
}
err = clGetDeviceIDs(platfrom_id, CL_DEVICE_TYPE_GPU, 1, &device_id, NULL);
if (err != CL_SUCCESS)
{
printf("Error: Failed to create a device group!\n");
return -1;
}
context = clCreateContext(0, 1, &device_id, NULL, NULL, NULL);
if (!context)
{
printf("Error: Failed to create a compute context!\n");
return -1;
}
commands = clCreateCommandQueue(context, device_id, 0, NULL);
if (!commands)
{
printf("Error: Failed to create a command commands!\n");
return -1;
}
#define MAX_SOURCE_SIZE (0x100000)
FILE *fp, *fp1;
char filename[] = "Template.cl";
fp = fopen(filename, "r");
if (fp == NULL)
{
printf("\n file not found \n");
return -1;
}
char * source_str = (char*)malloc(MAX_SOURCE_SIZE);
size_t size = fread(source_str, 1, MAX_SOURCE_SIZE, fp);
fclose(fp);
cl_mem classobj = clCreateBuffer(context, CL_MEM_USE_HOST_PTR, sizeof(tempstruct), &tempstruct, &err);
if (err != CL_SUCCESS)
{
printf("Error: Failed to allocate device memory!\n");
return -1;
}
program = clCreateProgramWithSource(context, 1, (const char **)& source_str, (const size_t *)&size, &err);
if (!program)
{
printf("Error: Failed to create program with source!\n");
return -1;
}
err = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL);
if (err != CL_SUCCESS)
{
printf("Error: Failed to build program executable!\n");
return -1;
}
test *resptr = (test *)clEnqueueMapBuffer(commands, classobj, CL_TRUE, CL_MAP_WRITE, NULL, sizeof(test), NULL, NULL, NULL, &err);
// INITIALISATION OF CLASS
tempstruct->a = 10;
if (!resptr)
{
printf("Error: Failed to create enqueuemapbuffer!\n");
return -1;
}
err = clEnqueueUnmapMemObject(commands, classobj, resptr, 0, NULL, NULL);
if (err != CL_SUCCESS)
{
printf("Error: Failed to write to source array!\n");
return -1;
}
kernel = clCreateKernel(program, "CLASS", &err);
if (err != CL_SUCCESS)
{
printf("Error: Failed to create compute kernel!\n");
return -1;
}
err = clSetKernelArg(kernel, 0, sizeof(cl_mem), &classobj);
if (err != CL_SUCCESS)
{
printf("Error: Failed to set kernel arguments! %d\n", err);
return -1;
}
size_t globalsize = 1;
size_t local = 1;
err = clEnqueueNDRangeKernel(commands, kernel, 1, NULL, &globalsize, &local, 0, NULL, NULL);
if (err)
{
printf("Error: Failed to execute nd range!\n");
return -1;
}
test *resptr1 = (test *)clEnqueueMapBuffer(commands, classobj, CL_TRUE, CL_MAP_READ, NULL, sizeof(test), NULL, NULL, NULL, &err);
err = clEnqueueUnmapMemObject(commands, classobj, resptr1, 0, NULL, NULL);
if (err != CL_SUCCESS)
{
printf("Error: Failed to read output array! %d\n", err);
return -1;
}
// again i am printing the class value
printf("\n in cpu side = %d\n", tempstruct->a);
}
//HOST END
//DEVICE SIDE(KERNEL CODE)
// filename : Template.cl
class test
{
public:
cl_int a;
cl_char b;
};
__kernel void CLASS(__global test *inclass)
{
inclass->a = 10;
printf("\n in kernel side = %d \n",inclass->a);
}
// KERNEL END
エラー:
私はこれらすべてのエラーカーネル側でのみ
1)エラーTempalte.CLに直面しています不明なタイプ名 'test'
2)Tempalte.CLのエラー ';'トップレベルの宣言子の後
3)エラーTempalte.CLプログラムスコープ変数は、一定のアドレス空間内で宣言される必要がある
4)エラーTempalte.CL未知のタイプ名 'クラスの
QUERY:
Q)私の主な質問は、クラスをIntelアーキテクチャのカーネルに渡す方法です。
*私は、AMDのクラスにクラスを正常に渡しました。 Intel側で同じコードを試すたびに、上記の4つのエラーが表示されます。
*インテルのカーネルにクラスを渡す方法はありますか?また、インテルのアーキテクチャでクラスをカーネルに渡すことも可能ですか?
これにはsyclが必要です。ほぼ純粋にC++を使用できます。エラーを起こすコードを投稿できますか?あなたはどのバージョンのopenclを使用していますか? –
@huseyin tugrul buyukisik、私はあなたの要求ごとにコードを追加しました。あなたがそれから見つけることができるものを教えてください。前もって感謝します。 – Harrisson