Сбой графического процессора только в конфигурации выпускаLinux

Ответить
Anonymous
 Сбой графического процессора только в конфигурации выпуска

Сообщение Anonymous »


У меня есть класс вызывающего узла с обратным вызовом для создания указателя на класс на графическом процессоре. В этом обратном вызове вызывается ядро ​​для создания экземпляра класса на графическом процессоре. Я правильно распределяю память на графическом процессоре для этого указателя класса.

Затем метод этого класса вызывается через второе ядро, и результат копируется обратно на хост.

Кажется, все это работает нормально в режиме отладки, но дает сбой в режиме выпуска. Это происходит как в Windows, так и в Linux. Это происходит независимо от того, компилирую ли я два файла .cu как часть одного исполняемого файла или как статическую (или динамическую) библиотеку и исполняемый файл, связывающийся с библиотекой.

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

Я придумал простой пример, воспроизводящий проблему, и включил различные фрагменты кода ниже. Вы можете просто скомпилировать оба файла .cu в Windows или Linux как часть уникального исполняемого файла, чтобы воспроизвести проблему.

Заранее большое спасибо за помощь и наилучшие пожелания.
[*]function.cuh
функция класса { публика: __device__ функция() {} виртуальный __device__ ~function() {} virtual __device__ doublecalc(const double& x) const = 0; }; класс pointer_derived: публичная pointer_base { функция** m_p; публика: pointer_derived(функция** p): m_p(p) {} операторная функция** () { return m_p; } }; [*]StaticLib.h #pragma один раз #include "Caller.h" double run_function(Caller* f, const double& x, bool use_local); [*]StaticLib.cu #include "StaticLib.h" #include "function.cuh" класс myfunction_local: общественная функция { публика: __device__ myfunction_local() {} __device__ ~myfunction_local() {} __device__ double Calc(const double& x) const { вернуть х * х; } }; __global__ void ignore_function(double* p, function** func, double x) { *p = (*func)->calc(x); } __global__ void ignore_local_builder(функция** ptr) { *ptr = новая myfunction_local(); } двойная функция run_function(Caller* c, const double& x, bool use_local) { функция** func_p; cudaError_t cudaStatus = cudaMalloc(&func_p, sizeof(function*)); pointer_derived ptr (func_p); если (use_local) вызвать_local_builder(ptr); еще c->get_function(ptr); двойной* п; cudaStatus = cudaMalloc(&p, sizeof(double)); вызвать_функцию(p,func_p,x); двойное разрешение; cudaMemcpy(&res, p, sizeof(double), cudaMemcpyDeviceToHost); вернуть разрешение; } [*]Caller.h #pragma один раз класс pointer_base { публика: pointer_base() {} виртуальный ~pointer_base() {} }; класс вызывающего абонента { публика: Звонящий() {} ~Вызывающий() {} void get_function (pointer_base& ptr); }; [*]Caller.cu #include "Caller.h" #include "function.cuh" класс myfunction: общественная функция { публика: __device__ моя функция() {} __device__ ~myfunction() {} __device__ double Calc(const double& x) const { вернуть х * х; } }; __global__ void ignore_builder(функция** ptr) { *ptr = новая моя функция(); } void Caller::get_function(pointer_base& func_p) { function** ptr = Dynamic_cast(func_p); вызвать_builder(ptr); } #include #include "StaticLib.h" интервал основной() { Звонящий звонящий; // use_local = true — работает как в релизе, так и в конфиге // use_local = false — происходит сбой в режиме выпуска, но работает в режиме отладки bool use_local = правда; двойное разрешение = run_function(&caller, 2.0, use_local); std::cout
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»