summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorCedric Nugteren <web@cedricnugteren.nl>2016-01-24 17:35:31 +0100
committerCedric Nugteren <web@cedricnugteren.nl>2016-01-24 17:35:31 +0100
commitf0b3091cdbb4465d4a3dd63ade52f061c3be60be (patch)
treeb4615352dd7f0601fc484170dbdd19fba50e01dc /scripts
parent09c94b17cf9019e302e388765e0c0d5768b2a969 (diff)
Added Python function to compute defaults for a particular device/vendor combination
Diffstat (limited to 'scripts')
-rw-r--r--scripts/database/database.py35
1 files changed, 26 insertions, 9 deletions
diff --git a/scripts/database/database.py b/scripts/database/database.py
index 4ce26277..8d8f6c40 100644
--- a/scripts/database/database.py
+++ b/scripts/database/database.py
@@ -20,9 +20,11 @@ import json
import pandas as pd
# Constants
-ATTRIBUTES = ["device", "device_vendor", "device_type", "device_core_clock", "device_compute_units",
- "precision", "kernel_family",
- "arg_m", "arg_n", "arg_k", "arg_alpha", "arg_beta"]
+DEVICETYPE_ATTRIBUTES = ["device_vendor", "device_type"]
+DEVICE_ATTRIBUTES = ["device", "device_core_clock", "device_compute_units"]
+KERNEL_ATTRIBUTES = ["precision", "kernel_family",
+ "arg_m", "arg_n", "arg_k", "arg_alpha", "arg_beta"]
+ATTRIBUTES = DEVICE_ATTRIBUTES + DEVICETYPE_ATTRIBUTES + KERNEL_ATTRIBUTES
# Pandas options
pd.set_option('display.width', 1000)
@@ -62,7 +64,7 @@ def ConcatenateData(df1, df2):
def RemoveDuplicates(df):
return df.drop_duplicates()
-# Bests
+# Retrieves the results with the lowest execution times
def GetBestResults(df):
dfbest = pd.DataFrame()
grouped = df.groupby(ATTRIBUTES+["kernel"])
@@ -71,6 +73,21 @@ def GetBestResults(df):
dfbest = ConcatenateData(dfbest, bestcase)
return dfbest
+# Sets defaults for devices of the same type/vendor based on the smallest values of all know
+# entries. The average might be better for performance but some parameters might not be supported
+# on other devices.
+def CalculateDefaults(df):
+ dfdefault = pd.DataFrame()
+ grouped = df.groupby(DEVICETYPE_ATTRIBUTES + KERNEL_ATTRIBUTES)
+ for name, dfgroup in grouped:
+ defaultValues = dfgroup.min(axis=0)
+ defaultValues["device"] = "default"
+ defaultValues["device_compute_units"] = 0
+ defaultValues["device_core_clock"] = 0
+ defaultValues["time"] = 0.0
+ dfdefault = dfdefault.append(defaultValues, ignore_index=True)
+ return dfdefault
+
# ==================================================================================================
# C++ header generation
# ==================================================================================================
@@ -112,7 +129,7 @@ def GetPrecision(family, precision):
# The C++ device type and vendor
def GetDeviceVendor(vendor, devtype):
- return(" { // %s %ss\n kDeviceType%s, kDeviceVendor%s, {\n"
+ return(" { // %s %ss\n kDeviceType%s, \"%s\", {\n"
% (vendor, devtype, devtype, vendor))
# Prints the data to a C++ database
@@ -132,7 +149,7 @@ def PrintData(df):
f.write(GetDeviceVendor(vendor, devtype))
for device, dfdevice in dfdevtype.groupby(["device"]):
devicename = "\"%s\"," % device
- f.write(" { %-20s { " % devicename)
+ f.write(" { %-48s { " % devicename)
# Collects the paramaters for this case and prints them
parameters = []
@@ -200,9 +217,9 @@ SaveDatabase(database, file_db)
# Retrieves the best performing results
bests = GetBestResults(database)
-# TODO: Determines the defaults for other vendors and per vendor
-#defaults = CalculateDefaults(bests)
-#bests = ConcatenateData(bests, defaults)
+# Determines the defaults for other vendors and per vendor
+defaults = CalculateDefaults(bests)
+bests = ConcatenateData(bests, defaults)
# Outputs the data as a C++ database
PrintData(bests)