diff -urpN magnum-jumbo/src/cuda/cuda_common.cu magnum-jumbo_listdev//src/cuda/cuda_common.cu --- magnum-jumbo/src/cuda/cuda_common.cu 2012-06-12 15:29:05.632293272 +0000 +++ magnum-jumbo_listdev//src/cuda/cuda_common.cu 2012-06-12 15:39:33.741668844 +0000 @@ -1,5 +1,5 @@ /* -* This software is Copyright (c) 2011 Lukas Odzioba +* This software is Copyright (c) 2012 Lukas Odzioba * and it is hereby released to the general public under the following terms: * Redistribution and use in source and binary forms, with or without modification, are permitted. */ @@ -7,32 +7,76 @@ #define _CUDA_COMMON_CU #include +#include #include "cuda_common.cuh" extern "C" void HandleError(cudaError_t err, const char *file, int line) { if (err != cudaSuccess) { - printf("%s in %s at line %d\n", cudaGetErrorString(err), file, - line); + fprintf(stderr, "%s in %s at line %d\n", + cudaGetErrorString(err), file, line); exit(EXIT_FAILURE); } } #define HANDLE_ERROR(err) (HandleError(err,__FILE__,__LINE__)) +static char *human_format(size_t size) +{ + char pref[] = { ' ', 'k', 'M', 'G' }; + int prefid = 0; + while (size > 1024) { + size /= 1024; + prefid++; + } + assert(prefid <= 3); + static char ret[32]; + sprintf(ret, "%d.%d %cB", size, (size%1024)/100,pref[prefid]); + return ret; +} + extern "C" void cuda_init(unsigned int gpu_id) { int devices; HANDLE_ERROR(cudaGetDeviceCount(&devices)); - if (gpu_id < devices && devices > 0 ) + if (gpu_id < devices && devices > 0) cudaSetDevice(gpu_id); else { - printf("Invalid CUDA device id = %u\n", gpu_id); - //fprintf(stderr, + fprintf(stderr, "Invalid CUDA device id = %d\n", gpu_id); exit(1); } } -#endif \ No newline at end of file +extern "C" +void cuda_device_list() +{ + int i, devices; + cudaGetDeviceCount(&devices); + printf("%d CUDA devices found:\n", devices); + for (i = 0; i < devices; i++) { + cudaDeviceProp devProp; + cudaGetDeviceProperties(&devProp, i); + printf("\nCUDA Device #%d\n", i); + printf("\tName: %s\n", devProp.name); + printf("\tCompute capability: sm_%d%d\n", + devProp.major, devProp.minor); + printf("\tNumber of multiprocessors: %d\n", + devProp.multiProcessorCount); + printf("\tClock rate: %d Mhz\n", + devProp.clockRate/1024); + printf("\tTotal global memory: %s\n", + human_format(devProp.totalGlobalMem+200000000)); + printf("\tTotal shared memory per block: %s\n", + human_format(devProp.sharedMemPerBlock)); + printf("\tTotal constant memory: %s\n", + human_format(devProp.totalConstMem)); + printf("\tKernel execution timeout: %s\n", + (devProp.kernelExecTimeoutEnabled ? "Yes" : "No")); + printf("\tConcurrent copy and execution: %s\n", + (devProp.deviceOverlap ? "Yes" : "No")); + } +} + +#endif diff -urpN magnum-jumbo/src/cuda/cuda_common.cuh magnum-jumbo_listdev//src/cuda/cuda_common.cuh --- magnum-jumbo/src/cuda/cuda_common.cuh 2012-06-12 15:29:05.632293272 +0000 +++ magnum-jumbo_listdev//src/cuda/cuda_common.cuh 2012-06-12 14:51:30.159667990 +0000 @@ -13,5 +13,6 @@ void HandleError(cudaError_t err, const extern "C" void cuda_init(unsigned int gpu_id); - +extern "C" +void cuda_device_list(); #endif \ No newline at end of file diff -urpN magnum-jumbo/src/john.c magnum-jumbo_listdev//src/john.c --- magnum-jumbo/src/john.c 2012-06-12 15:29:05.638293227 +0000 +++ magnum-jumbo_listdev//src/john.c 2012-06-12 15:44:33.115543807 +0000 @@ -562,9 +562,9 @@ static void john_init(char *name, int ar #ifdef CL_VERSION_1_0 printf(", opencl-devices"); #endif -//#ifdef HAVE_CUDA -// printf(", cuda-devices"); -//#endif +#ifdef HAVE_CUDA + printf(", cuda-devices"); +#endif printf("\n"); exit(0); } @@ -697,13 +697,13 @@ static void john_init(char *name, int ar exit(0); } #endif -//#ifdef HAVE_CUDA // yet to be implemented -// if (options.listconf && !strcasecmp(options.listconf, "cuda-devices")) -// { -// cuda_device_list(); -// exit(0); -// } -//#endif +#ifdef HAVE_CUDA + if (options.listconf && !strcasecmp(options.listconf, "cuda-devices")) + { + cuda_device_list(); + exit(0); + } +#endif if (options.listconf && !strcasecmp(options.listconf, "formats")) { int column;