Ошибка CudaStreamDestroy, возникающая при десериализации верхнего уровня переменной net_type [дубликат]

Если вы используете этот код на локальном сервере (т. е. ваш компьютер для целей разработки), он не отправит электронное письмо получателю. Что произойдет, он создаст файл .txt в папке с именем mailoutput.

В случае, если вы используете бесплатный сервисный сервис, например 000webhost или hostinger, эти поставщики услуг отключают функцию mail(), чтобы предотвратить непреднамеренное использование электронной почты, спам и т. д. Я предпочитаю вас чтобы связаться с ними, чтобы узнать, поддерживают ли они эту функцию.

Если вы уверены, что поставщик услуг поддерживает функцию mail (), вы можете проверить это руководство по PHP для дальнейшей справки, PHP mail ()

Чтобы проверить, поддерживает ли ваша служба хостинга функцию mail (), попробуйте запустить этот код (не забудьте изменить адрес электронной почты получателя)


Надеюсь, что это помогли.

8
задан einpoklum 6 March 2016 в 16:26
поделиться

1 ответ

Краткая версия:

Основная причина проблемы, когда class A создается вне основного, заключается в том, что определенная процедура подпрограммы, которая требуется для инициализации библиотеки времени выполнения CUDA с вашими ядрами, не является перед тем, как вызывается конструктор class A. Это происходит потому, что нет никаких гарантий относительно порядка, в котором статические объекты создаются и инициализируются в модели выполнения C ++. Ваш глобальный класс видимости создается для объектов глобальной области, которые инициализируются установкой CUDA. Ваш код ядра никогда не загружается в контекст перед его вызовом, и возникает ошибка времени выполнения.

Насколько я могу судить, это подлинное ограничение API-интерфейса CUDA, а не что-то легко фиксированное в коде пользователя. В вашем тривиальном примере вы могли бы заменить вызов ядра вызовом cudaMemset или одной из функций memset API, не основанных на символах, и он будет работать. Эта проблема полностью ограничена ядрами пользователей или символами устройств, загружаемыми во время выполнения через API среды выполнения. По этой причине пустой конструктор по умолчанию также решит вашу проблему. С точки зрения дизайна, я бы очень сомневался в любом шаблоне, который вызывает ядра в конструкторе. Добавление определенного метода для установки / отладки класса GPU, который не полагается на конструктор или деструктор по умолчанию, был бы более чистым и менее подверженным ошибкам дизайном IMHO.

Подробнее:

Существует внутренняя сгенерированная процедура (__cudaRegisterFatBinary), которая должна выполняться для загрузки и регистрации ядер, текстур и статически определенных символов устройства, содержащихся в полезной нагрузке жирного жира любой программы API выполнения во время выполнения с API-интерфейсом CUDA до того, как ядро ​​можно будет вызывать без ошибка. Это часть функции инициализации контекста «ленивого» интерфейса API. Вы можете подтвердить это для себя следующим образом:

Ниже приведен пример gdb пересмотренного примера, который вы опубликовали. Примечание. Я вставляю точку останова в __cudaRegisterFatBinary, и это не достигнуто до того, как вы вызовете статический конструктор A и не запускается запуск ядра:

talonmies@box:~$ gdb a.out 
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/talonmies/a.out...done.
(gdb) break '__cudaRegisterFatBinary' 
Breakpoint 1 at 0x403180
(gdb) run
Starting program: /home/talonmies/a.out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Scalar Field
[New Thread 0x7ffff5a63700 (LWP 10774)]
Class A
Kernel : invalid device function 
[Thread 0x7ffff5a63700 (LWP 10774) exited]
[Inferior 1 (process 10771) exited with code 0377]

Вот такая же процедура, на этот раз с A внутри main (что гарантировано произойдет после того, как объекты, выполняющие ленивую настройку, были инициализированы):

talonmies@box:~$ cat main.cu
#include "classA.h"


int main() {
    A a_object;
    std::cout << "Main" << std::endl;
    return 0;
}

talonmies@box:~$ nvcc --keep -arch=sm_30 -g main.cu
talonmies@box:~$ gdb a.out 
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/talonmies/a.out...done.
(gdb) break '__cudaRegisterFatBinary' 
Breakpoint 1 at 0x403180
(gdb) run
Starting program: /home/talonmies/a.out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, 0x0000000000403180 in __cudaRegisterFatBinary ()
(gdb) cont
Continuing.
Scalar Field
[New Thread 0x7ffff5a63700 (LWP 11084)]
Class A
Main
[Thread 0x7ffff5a63700 (LWP 11084) exited]
[Inferior 1 (process 11081) exited normally]

Если это действительно калечащая проблема для вас, я бы предложил связаться с вами Поддержка разработчиков NVIDIA и отчет об ошибке.

12
ответ дан talonmies 22 August 2018 в 15:17
поделиться
  • 1
    Отличный ответ. То же самое произойдет и для «глобально». инициализированные объекты тяги? – JackOLantern 22 July 2014 в 11:47
  • 2
    @JackOLantern: эта проблема будет ограничена любым объектом, который вызывает ядро ​​в его конструкторе. Если объект тяги вызывает ядро ​​во время построения, то это должно быть выполнено (и я думаю, что device_vector, который устанавливает значение по умолчанию во время создания экземпляра, будет кандидатом, хотя я не смотрел на источник в течение длительного времени, чтобы быть уверенным) , Спасибо за комплемент. Это мой 700-й (и, вероятно, последний) ответ на Stack Overflow . – talonmies 22 July 2014 в 11:55
  • 3
    Очень поучительный ответ. Я прибегал к функции-члену для инициализации данных по вашему запросу. Благодарю. – Noel 22 July 2014 в 12:44
  • 4
    Я не думаю, что вам нужно прекратить отвечать на StackOverflow. Время от времени появляются интересные вопросы. – JackOLantern 22 July 2014 в 14:02
  • 5
    Да, я также надеюсь, что вы продолжите. Возможно, остальные из нас могут обрабатывать «отбросы». и вы можете взять более сложные. :-) – Robert Crovella 22 July 2014 в 16:14
Другие вопросы по тегам:

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