2013-09-03 6 views
0

Я всегда предполагал, что renderscripts являются потокобезопасными с forEach через распределение. Чтобы помочь в моей отладке, может кто-то подтвердить это?Об ошибках и потокобезопасности

(я вижу статический контроль значение массива успешно, но с помощью rsDebug показывает, что проверка должна не увенчались успехом.

static uint32_t state[16]; 
static void f(); // modifies state. 

/* snip... */ 

void 
root(const uint32_t *in, uint32_t *out) 
{ 
    /* snip... */ 

    f(); 

    if(state[0] == 0) 
    { 
     rsDebug("state[0]", state[0]); 
     *out = 1; 
    } 
} 

Я вижу, напечатанный состояние [0] с ненулевым значением!)

ответ

0

Каждая ячейка должна выполняться независимо от других ячеек. Если вы пишете в другие ячейки вашего ввода (или вывода) Allocation, вы можете наверняка вызвать неопределенное поведение. Однако это ничем не отличается от любой другой многопоточной вычислительной модели. Можете ли вы точно показать свой код ядра и описать, как вы его называете?

+0

Мой код должен действовать полностью точечно. Весь скрипт слишком длинный, но я подведу его выше. Это вызвано вызовом forEach_root с Java. (Я знаю, что было некоторое упоминание о том, что скрипты не вызываются синхронно, но применимо ли это к статическим fns?) – zeta

+1

Вы действительно полагаетесь на неопределенное поведение здесь. Если ваша функция f() изменяет состояние, вы не можете иметь независимые потоки root(), ожидающие увидеть (или не увидеть) эти изменения. Подумайте об этом так: драйвер RS может запускать все потоки для root() последовательно или одновременно. Если ваш алгоритм/ядро ​​ведет себя по-другому на основе этого, вам нужно сделать что-то другое. –

+0

ОК. Я полагаю, что по расширению вы говорите, что Renderscript не гарантирует, что 'state' не будет изменен другими потоками, и поэтому ядро, как я описал выше, не является потокобезопасным. Правильно ли я понял? – zeta

Смежные вопросы