문제

GMP 유형 (MPZ_T, MPQ_T,…)과 같은 OpenCL 커널에서 사용자 정의 유형을 사용할 수 있습니까?

이와 같은 것을 갖기 위해서 #include <gmp.h>) :

#include <gmp.h>
__kernel square(
   __global mpz_t* input,
   __global mpz_t number,
   __global int* output,
   const unsigned int count)
{
   int i = get_global_id(0);
   if(i < count)
       output[i] = mpz_divisible_p(number,input[i]);
}

아마도 네 번째 매개 변수에 다른 인수를 추가함으로써옵션) 의 clBuildProgram ?

또는 OpenCL에는 이미 처리 할 수있는 유형이 있습니다 크기가 큰 번호 ?

도움이 되었습니까?

해결책

사용자 정의 유형을 사용할 수 있지만 커널에 사용 된 것은 OpenCL을 위해 특별히 작성해야합니다. 더 큰 정밀 번호를 구현하는 방법에 대해서는이 웹 사이트를 확인하십시오. FP128

편집 : NVIDIA의 CUDA SDK는 복소수 데이터 유형을 가지고 있습니다. 이상적이지는 않지만 그들이 어떻게 진행되는지에 대한 아이디어를 줄 수 있습니다. OpenCL은 비슷해야합니다.

다른 팁

일반적으로 OpenCL 프로그램에서 모든 유형을 사용할 수 있습니다. 그러나 수입은 작동하지 않으므로 동일한 프로그램 내에서 수입을 다시 정의해야합니다. 예를 들어:

typedef char my_char[8];

typedef struct tag_my_struct
{
    long int        id;
    my_char         chars[2];
    int             numerics[4]
    float           decimals[4];
} my_struct;

__kernel void foo(__global my_struct * input,
                  __global int * output)
{
    int gid = get_global_id(0);
    output[gid] = input[gid].numerics[3]== 2 ? 1 : 0;
}

그러나, 당신은 분명히 OpenCL 내외의 정의를 동일하게 유지해야합니다. 또한 유형이 장치와 호스트 모두에서 동일한 크기를 가지고 있는지 확인하십시오 ( sizeof(my_struct) 트릭을해야합니다). 어떤 경우에는 일치하는 크기를 갖기 위해 정의를 조정해야했습니다.

나는 Vhristov의 답변과 Dietr의 의견을 사용하여 내 일을하게되었습니다. 이 코드는 OpenCL 1.2에서 저를 위해 작동합니다

핵심

typedef struct tag_my_struct{
  int a;
  char b;
}my_struct;

__kernel void myKernel(__global my_struct *myStruct)
{
    int gid = get_global_id(0);
    (myStruct+gid)->a = gid;
    (myStruct+gid)->b = gid + 1;
}

주최자

typedef struct tag_my_struct{
  cl_int a;
  cl_char b;
}my_struct;

void runCode() 
{
    cl_int status = 0;
    my_struct* ms = new my_struct[5];

    cl_mem mem = clCreateBuffer(*context, 0, sizeof(my_struct)*5, NULL, &status);
    clEnqueueWriteBuffer(*queue, mem, CL_TRUE, 0, sizeof(my_struct)*5, &ms, 0, NULL, NULL);

    status = clSetKernelArg(*kernel, 0, sizeof(ms), &mem);

    size_t global[] = {5};
    status = clEnqueueNDRangeKernel(*queue, *kernel, 1, NULL, global, NULL, 0, NULL, NULL);

    status = clEnqueueReadBuffer(*queue, mem, CL_TRUE, 0, sizeof(my_struct)*5, ms, 0, NULL, NULL);

    for(int i = 0; i < 5; i++)
        cout << (ms+i)->a << " " << (ms+i)->b << endl;
}

산출

0 ☺

1 ☻

2 ♥

3 ♦

4 ♣

헤더 파일을 커널 파일에 포함시키려면 추가 할 수 있습니다. -L DIR clbuildprogram에 대한 논쟁으로 멍청이 헤더 파일이있는 디렉토리입니다.

더 많은 설명은 다음과 같습니다. OpenCL .CL 파일에 헤더를 포함하십시오

원천: http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clbuildprogram.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top