У меня есть на структуру примитива, который имеет следующее определение:OpenCL - копирование на структуру от глобального к локальной памяти
typedef struct Primitive {
float m[12];
float invm[12];
enum PrimitiveType type;
int rayDensity;
float util1;
float util2;
} Primitive;
я передать массив этих структур для моего ядра в постоянном буфере памяти:
__constant Primitive *objects;
в рамках оптимизации упражнений я хочу посмотреть на загрузку структур в локальную память, так что мое ядро имеет код для подобных этим:
__kernel void test(int n_objects, __constant Primitives *objects) {
local Primitive pFrom, pTo;
for(int i = 0; i < n_objects; i++) {
pFrom = objects[i];
}
}
Когда я запускаю это я получаю ошибку компиляции, говоря:
ptxas application ptx input, line 42; error: State space mismatch between instruction and address in instruction 'ld'
В качестве эксперимента я попытался первым копирования-структуру в приватной переменной, а затем к локальной переменной следующим образом:
__kernel void test(int n_objects, __constant Primitives *objects) {
Primitive pF, Pt;
local Primitive pFrom, pTo;
for(int i = 0; i < n_objects; i++) {
pF = objects[i]
pFrom = pF;
}
}
Которая теперь компилируется и работает, однако кажется, что объект не сильно скопирован в локальную переменную pFrom.
Обратите внимание, что мои образцы кода являются чисто образцами, и я сократил все ради краткости. Также мой код отлично работает, когда я использую примитивные структуры непосредственно из постоянной глобальной памяти.
Кто-нибудь знает, чего я здесь не вижу, конечно, его основные основы для глубокого копирования или пространства OpenCL.
Функция async_work_group_copy с wait_group_events - это ответ, я удивлен, что это не произошло ни в одном из моих поисков. Как ни странно, однако загрузка структуры в локальную память вместо использования константы увеличивает время выполнения. Может быть, трансляция из постоянной памяти быстрее, чем я думал – cubiclewar
Вы чередуете копию следующего элемента (ов) и обработки? Это делает ОГРОМНОЕ различие. – Ani
Я перепутал порядок операций, чтобы вызвать async_work_group_copy раньше и на всех элементах, затем выполните некоторую работу, прежде чем у меня будет барьер ожидания и используйте объекты. Это связано с небольшим (около 4%) сокращением времени выполнения. Однако этот метод не будет хорошо масштабироваться с увеличением числа структур, поскольку у меня закончится локальная память. – cubiclewar