是否有可能在OpenCL的内核像GMP类型(mpz_t,mpq_t,...)?

使用定制类型

要具有这样的事情(kernel没有建立,只是因为#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,其中的 DIR 的是头文件的目录

更多解释这里:包括标头的OpenCL .CL文件

来源:的http:// WWW .khronos.org /注册表/ CL / SDK / 1.0 /文档/人/ XHTML / clBuildProgram.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top