1

Я пытаюсь написать в массив 2d (float ** W) атомарно из разных потоков. Однако CAS всегда дает эту ошибку: несовместимый тип для аргумента 1 __sync_bool_compare_and_swapСравнение и своп на двумерном массиве

c = __sync_bool_compare_and_swap(&W[uu][i], a, b);

Он отлично работает, как обычно, когда я пишу atomcially в 1d массиве.

Любые идеи о том, как сделать эту работу? Я могу попробовать сделать 1d массивов в каждом потоке, а затем обновить этот 2d-массив после барьера, но это займет слишком много памяти. Я использую Ubuntu/Linux.

Спасибо.

+1

Я не думаю, что функции CAS поддерживают функцию с плавающей запятой. Является ли это в 2D или 1D массиве, не имеет значения, поскольку вы передаете только один элемент функции. – interjay

+0

На самом деле он поддерживает float, я попробовал массив float *, и он сработал. – masab

+0

Извините, я вам не верю. Функция не знает, является ли то, что вы передали, является частью массива 1D или 2D. – interjay

ответ

4
main() { 
    int* W = malloc(10); 
    int uu = 1, i = 3; 
    __sync_val_compare_and_swap(&W[uu], 1, 2); 
} 

компилирует хорошо, однако:

main() { 
    float* W = malloc(10); 
    int uu = 1, i = 3; 
    __sync_val_compare_and_swap(&W[uu], 1.0f, 2.0f); 
} 

не компилируется дает мне точно такое же сообщение, которое вы написали. Что указывает на то, что поплавки не поддерживаются:

The definition given in the Intel documentation allows only for the use of the types int, long, long long as well as their unsigned counterparts. GCC will allow any integral scalar or pointer type that is 1, 2, 4 or 8 bytes in length.

и похоже, что это подтверждает это.

Если вы не используете Itanium то, возможно,

The four non-arithmetic functions (load, store, exchange, and compare_exchange) all have a generic version as well. This generic version works on any data type.

вы можете использовать __atomic_compare_exchange*, потому что они должны работать на любых типах согласно документации. Я еще не пробовал это.

Edit:

main() { 
    float* W = malloc(10); 
    float target; 
    float val = 5.0f; 
    __atomic_exchange(&W[4], &val, &target, __ATOMIC_RELAXED); 
} 

^- это по крайней мере компилирует.

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

  • Нет связанных вопросов^_^