#include <signal.h>
#include <iostream>
#include <string>
#include <sstream>
#include <unistd.h>
#include <cuda.h>
#include <cuda_runtime_api.h>
static bool gRun = true;
void signalHandler(int signum)
{
gRun = false;
}
void writeLine(size_t &lastLineLength, const std::string &str)
{
size_t lineLen = str.size();
size_t k=0;
if (lastLineLength > lineLen) {
for (k=0; k<lastLineLength; ++k) {
std::cout << "\b";
}
for (k=0; k<lastLineLength; ++k) {
std::cout << " ";
}
}
for (k=0; k<lastLineLength; ++k) {
std::cout << "\b";
}
std::cout << str;
std::cout.flush();
lastLineLength = lineLen;
}
int main(int argc, char **argv)
{
cudaError_t err = cudaSuccess;
int deviceCount = 0;
size_t totalDevMem, freeDevMem;
size_t lastLineLength = 0;
signal(SIGTERM, signalHandler);
signal(SIGQUIT, signalHandler);
signal(SIGINT, signalHandler);
signal(SIGHUP, signalHandler);
writeLine(lastLineLength, "Preparing...");
err = cudaGetDeviceCount(&deviceCount);
if (err != cudaSuccess) {
std::cerr << "ERROR: " << cudaGetErrorString(err) << std::endl;
}
while (err == cudaSuccess && gRun) {
std::ostringstream stream;
for (int i=0; i < deviceCount; ++i) {
if (err == cudaSuccess) {
err = cudaSetDevice(i);
if (err == cudaSuccess) {
cudaMemGetInfo(&freeDevMem, &totalDevMem);
if (i != 0)
stream << " : ";
stream << "Dev " << i << " (" << (freeDevMem/1024) << " KB of " << (totalDevMem/1048576) << " MB free)";
}
}
}
if (err == cudaSuccess) {
writeLine(lastLineLength, stream.str());
}
sleep(5); }
std::cout << std::endl;
return 0;
}