Цитирование строки поиска не позволяет интерпретировать ее как глобус и тем самым устраняет проблему:
shopt -s extglob
foo='file(2)'
foo=${foo//'('/'\('}
foo=${foo//')'/'\)'}
printf '%s\n' "$foo"
(цитата о замене также позволяет избежать дублирования обратной косой черты).
Я только что взглянул на спецификацию металла сейчас. Я не буду пытаться полностью ответить на ваш последний вопрос. Но я думаю, что на вопросы синтаксиса можно ответить концептуально, просто имея дело с различными компонентами и следуя арифметическим правилам, определенным металлом.
он также не любит float2 (a, -b). Это выдает ошибку «нет подходящего конструктора для преобразования между float и float2». Как создать векторный литерал?
blockquote>Используйте для этой цели функции, определенные в заголовочном файле vector_functions.h (или .hpp). (см. пример ниже). Векторные типы, определенные для CUDA в vector_types.h, не имеют конструкторов.
Первое, что ему не нравится, это x.yx. В Metal это меняет порядок содержимого float2. Как изменить или изменить порядок доступа к вектору в Cuda?
blockquote>В CUDA нет встроенной функции обработки / перемещения нескольких векторных элементов. Просто выполните операцию над элементами, используя типы элементов.
metal: return float2(a, -b)*x.yx; CUDA: #include <vector_functions.h> ... return make_float2(a*x.y, -b*x.x);
Последнее, на что он жалуется, это отсутствие оператора * для float и float2 для строки dt f (x [i]). Если я удаляю dt и просто устанавливаю его на x [i] + = f (x [i]), он жалуется, что для float2 и float2 нет оператора + =. Как мне выполнить операции над этими типами и можно ли умножить векторы и скаляры?
blockquote>Как и выше, вам нужно будет построить эквивалентную арифметику поэлементно.
metal: x[i] += dt*f(x[i]); CUDA: float2 temp1 = x[i]; float2 temp2 = f(temp1); temp1.x += dt*temp2.x; temp1.y += dt*temp2.y; x[i] = temp1;
Должна быть возможность определить собственный набор векторных типов, чтобы соответствовать большинству возможностей металла, если вы хотите это сделать. То, что я здесь описываю, использует то, что является «встроенным», и может быть моделью, если вы хотите создать свои собственные типы с помощью конструкторов, арифметических операторов и т. Д.
Что касается вашего последнего вопроса, CUDA не всегда JIT во время выполнения, как вы описываете для металла. Вероятно, ближе всего к тому, что вы описываете, может быть что-то, использующее шаблонирование C ++, которое поддерживается CUDA. В общем, если вы можете преобразовывать операции с металлом в эквивалентные операции C ++, вы должны иметь возможность напрямую реализовывать их в CUDA.