summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-08-13 23:16:16 +0800
committerGitHub <[email protected]>2025-08-13 23:16:16 +0800
commit73909cc64059f30c56c3fb2d24451ccc60de3ebd (patch)
treef8b6036dddf02e5059507f026c7c7dea51962f9e
parent7ab1594d2578a0b31d0d09ed2ac813a8be0ee680 (diff)
parent7d808cdf1fcae9115f461295cdb27d46d01d4057 (diff)
Merge pull request #6706 from xq114/dev
fix find_cudadevices for CUDA 13
-rw-r--r--xmake/modules/lib/detect/find_cudadevices.lua6
-rw-r--r--xmake/scripts/find_cudadevices.cpp43
2 files changed, 39 insertions, 10 deletions
diff --git a/xmake/modules/lib/detect/find_cudadevices.lua b/xmake/modules/lib/detect/find_cudadevices.lua
index 2b75d725a..c780bf311 100644
--- a/xmake/modules/lib/detect/find_cudadevices.lua
+++ b/xmake/modules/lib/detect/find_cudadevices.lua
@@ -130,7 +130,7 @@ function _find_devices(verbose, opt)
local results, errors = try
{
function ()
- local args = { sourcefile, "-run", "-o", outfile , '-DPRINT_SUFFIX="' .. _PRINT_SUFFIX .. '"' }
+ local args = { sourcefile, "-run", "-lcuda", "-o", outfile , '-DPRINT_SUFFIX="' .. _PRINT_SUFFIX .. '"' }
if opt.arch == "x86" then
table.insert(args, "-m32")
elseif opt.arch == "x64" or opt.arch == "x86_64" then
@@ -247,6 +247,8 @@ function _order_by_flops(devices)
, [80] = 64
, [86] = 128
, [87] = 128
+ , [89] = 128
+ , [90] = 128
}
for _, dev in ipairs(devices) do
@@ -254,7 +256,7 @@ function _order_by_flops(devices)
if dev.major == 9999 and dev.minor == 9999 then
sm_per_multiproc = 1
else
- sm_per_multiproc = ngpu_arch_cores_per_sm[dev.major * 10 + dev.minor] or 64;
+ sm_per_multiproc = ngpu_arch_cores_per_sm[dev.major * 10 + dev.minor] or 128;
end
dev["$flops"] = dev.multiProcessorCount * sm_per_multiproc * dev.clockRate
end
diff --git a/xmake/scripts/find_cudadevices.cpp b/xmake/scripts/find_cudadevices.cpp
index fd002cc84..c8f082555 100644
--- a/xmake/scripts/find_cudadevices.cpp
+++ b/xmake/scripts/find_cudadevices.cpp
@@ -1,4 +1,5 @@
#include <cuda_runtime.h>
+#include <cuda.h>
#include <stdio.h>
#include <stdlib.h>
@@ -19,6 +20,19 @@ inline void check(cudaError_t result)
}
}
+inline void check_driver(CUresult result)
+{
+ static char unknown[] = "unknown";
+ if (result != CUDA_SUCCESS)
+ {
+ const char *name = NULL, *msg = NULL;
+ cuGetErrorName(result, &name);
+ cuGetErrorString(result, &msg);
+ fprintf(stderr, PRINT_SUFFIX "%s (%s)", name ? name : unknown, msg ? msg : unknown);
+ exit(0);
+ }
+}
+
inline void print_value(unsigned long long value)
{
printf("%llu", value);
@@ -115,21 +129,16 @@ inline void print_device(int id)
PRINT_PROPERTY(maxThreadsPerBlock);
PRINT_PROPERTY(maxThreadsDim);
PRINT_PROPERTY(maxGridSize);
- PRINT_PROPERTY(clockRate);
PRINT_PROPERTY(totalConstMem);
PRINT_PROPERTY(major);
PRINT_PROPERTY(minor);
PRINT_PROPERTY(textureAlignment);
PRINT_PROPERTY(texturePitchAlignment);
- PRINT_BOOL_PROPERTY(deviceOverlap);
PRINT_PROPERTY(multiProcessorCount);
- PRINT_BOOL_PROPERTY(kernelExecTimeoutEnabled);
PRINT_BOOL_PROPERTY(integrated);
PRINT_BOOL_PROPERTY(canMapHostMemory);
- PRINT_PROPERTY(computeMode);
PRINT_PROPERTY(maxTexture1D);
PRINT_PROPERTY(maxTexture1DMipmap);
- PRINT_PROPERTY(maxTexture1DLinear);
PRINT_PROPERTY(maxTexture2D);
PRINT_PROPERTY(maxTexture2DMipmap);
PRINT_PROPERTY(maxTexture2DLinear);
@@ -156,7 +165,6 @@ inline void print_device(int id)
PRINT_BOOL_PROPERTY(tccDriver);
PRINT_PROPERTY(asyncEngineCount);
PRINT_BOOL_PROPERTY(unifiedAddressing);
- PRINT_PROPERTY(memoryClockRate);
PRINT_PROPERTY(memoryBusWidth);
PRINT_PROPERTY(l2CacheSize);
PRINT_PROPERTY(maxThreadsPerMultiProcessor);
@@ -167,18 +175,37 @@ inline void print_device(int id)
PRINT_PROPERTY(regsPerMultiprocessor);
PRINT_BOOL_PROPERTY(isMultiGpuBoard);
PRINT_PROPERTY(multiGpuBoardGroupID);
- PRINT_PROPERTY(singleToDoublePrecisionPerfRatio);
PRINT_BOOL_PROPERTY(pageableMemoryAccess);
PRINT_BOOL_PROPERTY(concurrentManagedAccess);
PRINT_BOOL_PROPERTY(managedMemory);
+#if MY_CUDA_VER < 1300
+ PRINT_PROPERTY(clockRate);
+ PRINT_PROPERTY(memoryClockRate);
+ PRINT_BOOL_PROPERTY(deviceOverlap);
+ PRINT_BOOL_PROPERTY(kernelExecTimeoutEnabled);
+ PRINT_PROPERTY(computeMode);
+ PRINT_PROPERTY(maxTexture1DLinear);
+ PRINT_PROPERTY(singleToDoublePrecisionPerfRatio);
+#else
+ int clockRate, memoryClockRate, computeMode;
+ check_driver(cuDeviceGetAttribute(&clockRate, CU_DEVICE_ATTRIBUTE_CLOCK_RATE, id));
+ check_driver(cuDeviceGetAttribute(&memoryClockRate, CU_DEVICE_ATTRIBUTE_MEMORY_CLOCK_RATE, id));
+ check_driver(cuDeviceGetAttribute(&computeMode, CU_DEVICE_ATTRIBUTE_COMPUTE_MODE, id));
+ print_property("clockRate", clockRate);
+ print_property("memoryClockRate", memoryClockRate);
+ print_property("computeMode", computeMode);
+#endif
+
#if MY_CUDA_VER >= 900
// Added in cuda 9.0
PRINT_BOOL_PROPERTY(computePreemptionSupported);
PRINT_BOOL_PROPERTY(canUseHostPointerForRegisteredMem);
PRINT_BOOL_PROPERTY(cooperativeLaunch);
- PRINT_BOOL_PROPERTY(cooperativeMultiDeviceLaunch);
PRINT_PROPERTY(sharedMemPerBlockOptin);
+#if MY_CUDA_VER < 1300
+ PRINT_BOOL_PROPERTY(cooperativeMultiDeviceLaunch);
+#endif
#endif
#if MY_CUDA_VER >= 902