Mercurial > hg > truffle
diff src/gpu/ptx/vm/gpu_ptx.cpp @ 11842:8d8f63069f58
PTX warp limiter to available GPU processors
author | Morris Meyer <morris.meyer@oracle.com> |
---|---|
date | Mon, 30 Sep 2013 13:03:47 -0400 |
parents | 365d8f385fb5 |
children | 372bacc13022 |
line wrap: on
line diff
--- a/src/gpu/ptx/vm/gpu_ptx.cpp Mon Sep 30 17:03:14 2013 +0200 +++ b/src/gpu/ptx/vm/gpu_ptx.cpp Mon Sep 30 13:03:47 2013 -0400 @@ -50,6 +50,28 @@ gpu::Ptx::cuda_cu_memcpy_dtoh_func_t gpu::Ptx::_cuda_cu_memcpy_dtoh; gpu::Ptx::cuda_cu_memfree_func_t gpu::Ptx::_cuda_cu_memfree; + +/* + * see http://en.wikipedia.org/wiki/CUDA#Supported_GPUs + */ +int ncores(int major, int minor) { + int device_type = major << 4 + minor; + + switch (device_type) { + case 0x10: return 8; + case 0x11: return 8; + case 0x12: return 8; + case 0x13: return 8; + case 0x20: return 32; + case 0x21: return 48; + case 0x30: return 192; + case 0x35: return 192; + defaulf: + tty->print_cr("[CUDA] Warning: Unhandled device %x", device_type); + return 0; + } +} + bool gpu::Ptx::initialize_gpu() { /* Initialize CUDA driver API */ @@ -95,24 +117,7 @@ } /* Get device attributes */ - int minor, major, unified_addressing; - status = _cuda_cu_device_get_attribute(&minor, GRAAL_CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, _cu_device); - - if (status != GRAAL_CUDA_SUCCESS) { - tty->print_cr("[CUDA] Failed to get minor attribute of device: %d", _cu_device); - return false; - } - - status = _cuda_cu_device_get_attribute(&major, GRAAL_CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, _cu_device); - - if (status != GRAAL_CUDA_SUCCESS) { - tty->print_cr("[CUDA] Failed to get major attribute of device: %d", _cu_device); - return false; - } - - if (TraceGPUInteraction) { - tty->print_cr("[CUDA] Compatibility version of device %d: %d.%d", _cu_device, major, minor); - } + int unified_addressing; status = _cuda_cu_device_get_attribute(&unified_addressing, GRAAL_CU_DEVICE_ATTRIBUTE_UNIFIED_ADDRESSING, _cu_device); @@ -139,9 +144,50 @@ tty->print_cr("[CUDA] Using %s", device_name); } + return true; } +unsigned int gpu::Ptx::total_cores() { + + int minor, major, nmp; + int status = _cuda_cu_device_get_attribute(&minor, + GRAAL_CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, + _cu_device); + + if (status != GRAAL_CUDA_SUCCESS) { + tty->print_cr("[CUDA] Failed to get minor attribute of device: %d", _cu_device); + return 0; + } + + status = _cuda_cu_device_get_attribute(&major, + GRAAL_CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, + _cu_device); + + if (status != GRAAL_CUDA_SUCCESS) { + tty->print_cr("[CUDA] Failed to get major attribute of device: %d", _cu_device); + return 0; + } + + status = _cuda_cu_device_get_attribute(&nmp, + GRAAL_CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT, + _cu_device); + + if (status != GRAAL_CUDA_SUCCESS) { + tty->print_cr("[CUDA] Failed to get numberof MPs on device: %d", _cu_device); + return 0; + } + + int total = nmp * ncores(major, minor); + + if (TraceGPUInteraction) { + tty->print_cr("[CUDA] Compatibility version of device %d: %d.%d", _cu_device, major, minor); + tty->print_cr("[CUDA] Number of cores: %d", total); + } + return (total); + +} + void *gpu::Ptx::generate_kernel(unsigned char *code, int code_len, const char *name) { struct CUmod_st * cu_module;