13

是否可以在 OpenCL 内核中使用自定义类型,例如 gmp 类型 (mpz_t, mpq_t, ...)?

拥有这样的东西(这个内核不会仅仅因为#include <gmp.h>):

#include <gmp.h>
__内核正方形(
   __global mpz_t* 输入,
   __global mpz_t 编号,
   __global int* 输出,
   const unsigned int 计数)
{
   int i = get_global_id(0);
   如果(我 < 计数)
       输出[i] = mpz_divisible_p(数字,输入[i]);
}

也许通过向第四个参数(选项)添加不同的参数clBuildProgram

还是 OpenCL 已经有了可以处理大量数字的类型?

4

4 回答 4

21

通常,您可以在 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 内外的定义相同。还要确保类型在设备和主机上具有相同的大小(使用 asizeof(my_struct)应该可以解决问题)。在某些情况下,我不得不调整定义以匹配大小。

于 2010-07-22T12:20:34.683 回答
7

我使用 VHristov 的回答和节食者的评论让我的工作。此代码在 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☺</p>

1 ☻</p>

2♥</p>

3 ♦</p>

4♣</p>

于 2013-08-23T22:07:42.870 回答
4

您可以使用自定义类型,但内核中使用的任何内容都需要专门为 OpenCL 编写。查看这个网站也许可以了解如何实现更大的精度数字:FP128

编辑:NVIDIA 的 CUDA SDK 有一个复数数据类型,它并不理想,但可能会给你一些关于他们如何去做的想法,OpenCL 应该是类似的。

于 2010-03-14T18:43:29.750 回答
3

如果要将头文件包含到内核文件中,可以将-l dir作为参数添加到 clBuildProgram,其中dir是包含头文件的目录。

这里有更多解释:include headers to OpenCL .cl file

资料来源:http ://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clBuildProgram.html

于 2013-09-24T01:58:56.147 回答