gpt4 book ai didi

memory-management - 在 OpenCL 内核中创建本地数组动态

转载 作者:行者123 更新时间:2023-12-04 08:57:46 29 4
gpt4 key购买 nike

我有一个 OpenCL 内核,它需要将一个数组作为多个数组进行处理,其中每个子数组和都保存在本地缓存数组中。

例如,想象一下 fowling 数组:

[[1, 2, 3, 4], [10, 30, 1, 23]]
  • 每个工作组都有一个数组(在示例中我们有 2 个工作组);
  • 每个工作项处理两个数组索引(例如将值索引乘以 local_id),其中工作项结果保存在工作组共享数组中。
    __kernel void test(__global int **values, __global int *result, const int array_size){
    __local int cache[array_size];

    // initialise
    if (get_local_id(0) == 0){
    for (int i = 0; i < array_size; i++)
    cache[i] = 0;
    }

    barrier (CLK_LOCAL_MEM_FENCE);

    if(get_global_id(0) < 4){
    for (int i = 0; i<2; i++)
    cache[get_local_id(0)] += values[get_group_id(0)][i] *
    get_local_id(0);
    }

    barrier (CLK_LOCAL_MEM_FENCE);

    if(get_local_id(0) == 0){
    for (int i = 0; i<array_size; i++)
    result[get_group_id(0)] += cache[i];
    }
    }

  • 问题是我无法通过使用内核参数来定义缓存数组大小,但我需要这样做才能拥有动态内核。

    如何动态创建它?像c中的malloc函数...

    或者唯一可用的解决方案是向我的内核函数发送一个临时数组?

    最佳答案

    这可以通过添加 __local 来实现数组作为内核参数:

    __kernel void test(__global int **values, __global int *result, 
    const int array_size, __local int * cache)

    并提供所需的内核参数大小:
    clSetKernelArg(kernel, 3, array_size*sizeof(int), NULL);

    本地内存将在内核调用时分配。请注意,可能需要进行额外检查以确保所需的本地内存大小不超过设备限制。

    关于memory-management - 在 OpenCL 内核中创建本地数组动态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17574570/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com