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);
}
^- это по крайней мере компилирует.
Я не думаю, что функции CAS поддерживают функцию с плавающей запятой. Является ли это в 2D или 1D массиве, не имеет значения, поскольку вы передаете только один элемент функции. – interjay
На самом деле он поддерживает float, я попробовал массив float *, и он сработал. – masab
Извините, я вам не верю. Функция не знает, является ли то, что вы передали, является частью массива 1D или 2D. – interjay