В моем приложении у меня есть какой-то часть кода, которая работает следующим образомCUDA контекст времени жизни
main.cpp
int main()
{
//First dimension usually small (1-10)
//Second dimension (100 - 1500)
//Third dimension (10000 - 1000000)
vector<vector<vector<double>>> someInfo;
Object someObject(...); //Host class
for (int i = 0; i < N; i++)
someObject.functionA(&(someInfo[i]));
}
Object.cpp
void SomeObject::functionB(vector<vector<double>> *someInfo)
{
#define GPU 1
#if GPU == 1
//GPU COMPUTING
computeOnGPU(someInfo, aConstValue, aSecondConstValue);
#else
//CPU COMPUTING
#endif
}
объект .cu
extern "C" void computeOnGPU(vector<vector<double>> *someInfo, int aConstValue, int aSecondConstValue)
{
//Copy values to constant memory
//Allocate memory on GPU
//Copy data to GPU global memory
//Launch Kernel
//Copy data back to CPU
//Free memory
}
Так как (надеюсь), вы можете видеть в коде, функция, которая подготавливает графический процессор, вызывается много раз в зависимости от значения первого измерения.
Все значения, которые я отправляю в постоянную память, всегда остаются неизменными, а размеры указателей, выделенных в глобальной памяти, всегда одинаковы (данные изменяются только один).
Это фактический рабочий процесс в моем коде, но я не получаю ускорения при использовании GPU, я имею в виду, что ядро выполняется быстрее, но передача памяти стала моей проблемой (как сообщает nvprof).
Так что мне было интересно, где в моем приложении начинается и заканчивается контекст CUDA, чтобы узнать, есть ли способ сделать это только после копирования в постоянную память и выделение памяти.
Хорошо. Я думал, что контекст cuda закончен, когда cudaFree или что-то подобное произошло. Спасибо, я проверю, как это происходит. – BRabbit27