Cuda Kernel-эквивалент ядра Metal Compute

Цитирование строки поиска не позволяет интерпретировать ее как глобус и тем самым устраняет проблему:

shopt -s extglob
foo='file(2)'
foo=${foo//'('/'\('}
foo=${foo//')'/'\)'}
printf '%s\n' "$foo"

(цитата о замене также позволяет избежать дублирования обратной косой черты).

0
задан user1139069 18 January 2019 в 23:09
поделиться

1 ответ

Я только что взглянул на спецификацию металла сейчас. Я не буду пытаться полностью ответить на ваш последний вопрос. Но я думаю, что на вопросы синтаксиса можно ответить концептуально, просто имея дело с различными компонентами и следуя арифметическим правилам, определенным металлом.

он также не любит float2 (a, -b). Это выдает ошибку «нет подходящего конструктора для преобразования между float и float2». Как создать векторный литерал?

Используйте для этой цели функции, определенные в заголовочном файле vector_functions.h (или .hpp). (см. пример ниже). Векторные типы, определенные для CUDA в vector_types.h, не имеют конструкторов.

Первое, что ему не нравится, это x.yx. В Metal это меняет порядок содержимого float2. Как изменить или изменить порядок доступа к вектору в Cuda?

В 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 нет оператора + =. Как мне выполнить операции над этими типами и можно ли умножить векторы и скаляры?

Как и выше, вам нужно будет построить эквивалентную арифметику поэлементно.

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.

0
ответ дан Robert Crovella 18 January 2019 в 23:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: