Я передаю структурный указатель на мое ядро ​​- как я могу сделать эти данные доступными для вспомогательных функций? - PullRequest
1 голос
/ 28 июня 2011

Добрый день, ребята!

У меня есть структура с более чем 100 параметрами, необходимыми для моего ядра.Я создаю объект буфера для данных, делаю запись и устанавливаю указатель на эти данные в качестве аргумента ядра.(Аргумент ядра __global, но я пробовал другие типы для него.)

Пока все хорошо!Я прекрасно вижу элементы структуры из моей функции ядра!

Однако я хочу, чтобы дюжина вспомогательных функций имела доступ к этим параметрам.Я пытался, но я не нашел способ сделать это.Если я пытаюсь скопировать (__global) vh в другой глобальный указатель, или в __local указатель, или в __private указатель, произойдет сбой.Если я попытаюсь скопировать данные самой структуры в копию структуры __global, __local или __private, произойдет сбой.Я пробовал побайтные копии, я пробовал async_work_group_copy, я пробовал приведение, я пытался передать весь указатель __global в вспомогательные функции, я пробовал другие типы для самого аргумента ядра, я пробовалвсе, что я могу придумать.Похоже, что эти данные не могут быть переданы этим вспомогательным функциям, но должно быть возможно, верно?

Любой ответ будет приветствоваться, даже если он "может"это будет сделано ", или" ты идиот ".Я задал этот вопрос на другом форуме, и никто так много не сказал, хотя, возможно, я не правильно сформулировал свой вопрос.Но ... я не могу быть единственным человеком в мире с вспомогательными функциями в коде ядра, верно?Как, черт возьми, вы получаете те данные, которые были переданы в функцию ядра?

Спасибо, ребята .... Дэвид, Спасибо ....

1 Ответ

2 голосов
/ 28 июня 2011

Вот пример, демонстрирующий желаемую функциональность, надеюсь, это поможет!

Определения структуры:

typedef struct agent {
    uint energy;
    uint action;
    uint type;
    uint next;
} AGENT __attribute__ ((aligned (16)));

typedef struct sim_params {
    uint size_x;
    uint size_y;
    uint size_xy;
    uint max_agents;
    uint null_agent_pointer;
    uint grass_restart;
    uint lines_per_thread;
} SIM_PARAMS;

typedef struct cell {
    uint grass;
    uint agent_pointer;
} CELL;

Вспомогательная функция:

/*
 * Helper function
 */
void removeAgentFromCell(__global AGENT * agents, 
    __global CELL * matrix,
    uint cellIndex,
    uint agentIndex,
    uint previousAgentIndex,
    SIM_PARAMS sim_params) 
{

    ...
}

Основное ядро:

/*
 * The kernel
 */
__kernel void step1(__global AGENT * agents, 
        __global CELL * matrix,
        __global ulong * seeds,
        const uint turn,
        const SIM_PARAMS sim_params)
{
    uint index;
    uint agentIndex;
    uint previousAgentIndex;
    ...
    // Call helper function
    removeAgentFromCell(agents, matrix, index, agentIndex, previousAgentIndex, sim_params);
    ...
}

Пробовал и тестировал и работал в AMD APP SDK (как на CPU, так и на GPU) и Nvidia CUDA Toolkit. Поэтому я думаю, что это будет работать в OSX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...