2013-07-18 2 views
-1

В моем приложении у меня есть какой-то часть кода, которая работает следующим образом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, чтобы узнать, есть ли способ сделать это только после копирования в постоянную память и выделение памяти.

ответ

1

Обычно контекст cuda начинается с первого вызова CUDA в вашем приложении и заканчивается, когда приложение завершается.

Вы должны иметь возможность делать то, что вы имеете в виду, чтобы делать распределения только один раз (в начале вашего приложения) и соответствующие свободные операции только один раз (в конце вашего приложения) и заполнять __constant__ памяти только один раз, прежде чем он будет использоваться в первый раз.

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

+0

Хорошо. Я думал, что контекст cuda закончен, когда cudaFree или что-то подобное произошло. Спасибо, я проверю, как это происходит. – BRabbit27