Mam klasy, który wywołuje jądra w jej konstruktora, co następuje:Kłopoty z uruchomieniem jąder CUDA kod inicjalizacji static
"ScalarField.h"
#include <iostream>
void ERROR_CHECK(cudaError_t err,const char * msg) {
if(err!=cudaSuccess) {
std::cout << msg << " : " << cudaGetErrorString(err) << std::endl;
std::exit(-1);
}
}
class ScalarField {
public:
float* array;
int dimension;
ScalarField(int dim): dimension(dim) {
std::cout << "Scalar Field" << std::endl;
ERROR_CHECK(cudaMalloc(&array, dim*sizeof(float)),"cudaMalloc");
}
};
"classA.h"
#include "ScalarField.h"
static __global__ void KernelSetScalarField(ScalarField v) {
int index = threadIdx.x + blockIdx.x * blockDim.x;
if (index < v.dimension) v.array[index] = 0.0f;
}
class A {
public:
ScalarField v;
A(): v(ScalarField(3)) {
std::cout << "Class A" << std::endl;
KernelSetScalarField<<<1, 32>>>(v);
ERROR_CHECK(cudaGetLastError(),"Kernel");
}
};
"main.cu"
#include "classA.h"
A a_object;
int main() {
std::cout << "Main" << std::endl;
return 0;
}
Jeśli uruchomię tę klasę na głównej (A a_object;
), nie otrzymam żadnych błędów. Jednakże, jeśli utworzę go poza głównym, zaraz po jego zdefiniowaniu (class A {...} a_object;
) otrzymuję komunikat o błędzie "nieprawidłowa funkcja urządzenia" po uruchomieniu jądra. Dlaczego tak się dzieje?
EDIT
kod bieżąco, aby zapewnić pełniejszy przykład.
EDIT 2
Po poradę w komentarzu przez Raxvan, chciałem powiedzieć, że mają dimensions
zmienna użyta w konstruktorze ScalarField również zdefiniowany (w innej klasie) poza głównym, ale przed wszystkim innym. Czy to może być wyjaśnienie? Debugger miał jednak odpowiednią wartość dla dimensions
.
Czy możesz podać więcej pomocy codeto, aby odpowiedzieć na następujące pytania: Czy klasa A znajduje się w jej własnym pliku, ale jądro znajduje się w innym, jakie jest rozszerzenie pliku itp. Powinieneś podać wystarczający kod dla innych, aby móc replikować twój problem. – deathly809
@Noel Perez Gonzalez, jeśli zdefiniowano "a_Object" jako zmienną globalną, rozpoczyna wykonywanie podczas globalnej inicjalizacji danych. Jest to bardzo zła praktyka, ponieważ nie ma możliwości poznania kolejności wykonania. Mając to na uwadze możliwe jest, że kod, który inicjuje wszystkie rzeczy CUDA, działa później niż dane globalne. – Raxvan
Zaktualizowałem pytanie, dodając więcej kodu (proszę zauważyć, że go nie skompilowałem). @Raxvan Dzięki za poradę, po prostu myślałem, że kolejność runtime była taka sama jak kolejność kompilacji. – Noel