2012-06-18 2 views
2

У меня есть на структуру примитива, который имеет следующее определение: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.

ответ

1

Что вам нужно, это async_work_group_copy function. Вы можете дождаться завершения этой операции async с помощью функции wait_group_events.

Надеюсь, это поможет.

+0

Функция async_work_group_copy с wait_group_events - это ответ, я удивлен, что это не произошло ни в одном из моих поисков. Как ни странно, однако загрузка структуры в локальную память вместо использования константы увеличивает время выполнения. Может быть, трансляция из постоянной памяти быстрее, чем я думал – cubiclewar

+0

Вы чередуете копию следующего элемента (ов) и обработки? Это делает ОГРОМНОЕ различие. – Ani

+0

Я перепутал порядок операций, чтобы вызвать async_work_group_copy раньше и на всех элементах, затем выполните некоторую работу, прежде чем у меня будет барьер ожидания и используйте объекты. Это связано с небольшим (около 4%) сокращением времени выполнения. Однако этот метод не будет хорошо масштабироваться с увеличением числа структур, поскольку у меня закончится локальная память. – cubiclewar