2016-04-12 10 views
3

У нас есть проект, написанный в Фортране.Библиотека OpenACC Взаимодействие: как получить указатель устройства?

Теперь я знаю, что это можно сделать с использованием компиляторов PGI, но я не хочу зацикливаться на лицензиях.

Я пытаюсь посмотреть, можем ли мы использовать OpenACC в нашем проекте. Я установил gcc5.2, используя инструкции здесь.

https://github.com/olcf/OLCFHack15

Теперь я хочу сделать что-то подобное тому, что сказано здесь.

https://gcc.gnu.org/onlinedocs/libgomp/OpenACC-Library-Interoperability.html

Более конкретно, что указано в разделе 8.3. Я пытаюсь точно воспроизвести его с помощью gfortran. К сожалению, я не вижу, как я могу сделать это в fortran. В примере,

d_X = acc_copyin(&h_X[0], N * sizeof (float)); 

Это позволяет D_X быть непосредственно использованы в

s = cublasSaxpy(h, N, &alpha, d_X, 1, d_Y, 1); 

Но в Фортране acc_copyin не возвращает ничего.

Итак, как бы я воспроизвести дело в Фортране?

+0

Глядя на спецификацию, кажется, что интерфейс Fortran OpenACC довольно ограничен. Он избегает любого материала указателя, даже когда это было бы возможно с помощью 'type (c_ptr)'. Я не уверен, можно ли вызвать функцию C с помощью 'bind (C)'? –

ответ

1

Вы желаете перейти с помощью cuBLAS или это более общее? cuBLAS предоставляет интерфейс стиля F77 (см.: http://docs.nvidia.com/cuda/cublas/#appendix-b-cublas-fortran-bindings)

Решение OpenACC предназначено для управления вашими данными, как обычно, используя директиву «данные», а затем вызывать процедуру CUDA C из области «host_data». «host_data» указывает, что указатель устройства должен использоваться с этой областью. Следовательно, при передаче «d_X» в cublasSaxpy будет передан указатель устройства.

Оговорка с cuBLAS заключается в том, что упомянутый выше интерфейс F77 ожидает массивы узлов и будет управлять перемещением данных для вас. Следовательно, вам нужно написать функции оболочки CUDA C для вызова правильных процедур устройства. (CUDA Fortran предоставляет модуль cublas для этого, но только PGI)

Хотя, GNU 5.2 не поддерживает «host_data», и я просто просмотрел их страницу статуса (https://gcc.gnu.org/wiki/OpenACC), и это не похоже на то, что это будет поддерживаться в Fortran в 6.0. К сожалению, поскольку «host_data» - лучшее решение для вас.

Обратите внимание, что NVIDIA предоставляет бесплатную лицензию PGI студентам и преподавателям для учебных целей как часть инструмента OpenACC Toolkit (см.: https://developer.nvidia.com/openacc).

+0

Возможно, я неправильно интерпретирую этот вопрос, но я вижу его как: Могу ли я получить указатель на ячейку памяти, которую я выделил (и скопировал данные) в программе Fortran OpenACC 'acc_copyin'? Когда я просматриваю спецификацию OpenACC, они в основном игнорируют все, что имеет отношение к указателям и распределению памяти в интерфейсе Fortran, что значительно ухудшает его. Я бы попробовал написать пользовательский интерфейс Fortran для более мощных подпрограмм '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ', но я не знаю, если они могут быть просто вызваны или есть еще несколько магии происходит за кулисами. –

+0

Я не думаю, что это надзор, так как обращение с необработанными C-указателями нелегко сделать в Fortran.Это проще в CUDA Fortran, так как язык был расширен, чтобы включить понятие данных устройства, но в обычном Fortran это немного сложно. У вас есть прецедент? Если это так, мое предложение состояло бы в том, чтобы отправить записку непосредственно в комитет OpenACC ([email protected]) с просьбой добавить это. Они всегда ищут хорошие предложения и идеи. –

+0

Если вы не выполняете арифметику указателей, а просто храните и передаете адрес '(void *)', вы можете использовать C-указатели непосредственно как 'type (c_ptr)' в Fortran. Другой вариант - «integer (c_intptr_t)», но хуже. Оба доступны более 10 лет на этом языке. Если указатель устройства не совместим с 'void *', это будет другая история. CUDA Fortran ... не является точкой OpenACC, чтобы избежать прямого программирования в CUDA? Как я писал, вы можете вызвать C 'acc_malloc' из Fortran, если это просто функция, но я не знаю, не происходит ли что-то еще за кулисами. –