在测量代码的运行时间时,我将如何使用执行代码来求解矩阵?
How would I use execute code to solve matrices while measuring the runtime of the code?
我最好使用 C++ 来执行代码,但我愿意接受任何针对这种情况的更好语言的建议。我基本上想使用 Strassen 算法来求解矩阵,并且我想知道如何求解矩阵并测量其 运行 时间。
# 版本 3.6
import numpy as np
def split(matrix):
"""
Splits a given matrix into quarters.
Input: nxn matrix
Output: tuple containing 4 n/2 x n/2 matrices corresponding to a, b, c, d
"""
row, col = matrix.shape
row2, col2 = row//2, col//2
return matrix[:row2, :col2], matrix[:row2, col2:], matrix[row2:, :col2],
matrix[row2:, col2:]
def strassen(x, y):
"""
Computes matrix product by divide and conquer approach, recursively.
Input: nxn matrices x and y
Output: nxn matrix, product of x and y
"""
# Base case when size of matrices is 1x1
if len(x) == 1:
return x * y
# Splitting the matrices into quadrants. This will be done recursively
# untill the base case is reached.
a, b, c, d = split(x)
e, f, g, h = split(y)
# Computing the 7 products, recursively (p1, p2...p7)
p1 = strassen(a, f - h)
p2 = strassen(a + b, h)
p3 = strassen(c + d, e)
p4 = strassen(d, g - e)
p5 = strassen(a + d, e + h)
p6 = strassen(b - d, g + h)
p7 = strassen(a - c, e + f)
# Computing the values of the 4 quadrants of the final matrix c
c11 = p5 + p4 - p2 + p6
c12 = p1 + p2
c21 = p3 + p4
c22 = p1 + p5 - p3 - p7
# Combining the 4 quadrants into a single matrix by stacking horizontally and vertically.
c = np.vstack((np.hstack((c11, c12)), np.hstack((c21, c22))))
return c
我找到了上面的算法代码。
#include <time.h>
int main(void) {
clock_t tStart = clock();
/* Do your stuff here */
printf("Time taken: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);
return 0;
}
我找到了这个用于测量代码运行时间的代码。但是我看到我可以使用
/usr/bin/time ./MyProgram if I have cygwin installed.
简而言之,我将如何使用我的代码使用 Strassen 算法和其他矩阵求解算法来求解实际矩阵?另外,我将如何 运行 代码?谢谢大家的帮助,我是coding的新手,为了测试不同矩阵求解算法在不同场景下的算法效率,所以才这样做。
时间测量
时间的测量取决于平台那又怎样OS?在 windows 上,我会使用 Performance Counters。如果您可以访问 x86 程序集,您也可以使用 RDTSC 指令,但这需要一些知识才能正确使用,例如将亲和力设置为单个 CPU、获取和稳定 CPU 频率等
OS time granularity 也是一个问题,因此如果您的测量过程太短,您可能需要对多个测量进行一些过滤以获得正确的值。
您可以通过测量该过程的多次重复来避免某些问题,这样时间就会超过 100 毫秒,并将结果时间除以重复次数。
同时重复使用相同的 code/data,同时测量 CACHE can be a problem 太乱了你的结果。
运行宁码
你的代码看起来像 Python 所以你不能直接在 C/C++ 中使用它,而是需要用 Python 解释器以某种方式调用它,例如 creating python process 参数告诉它打开和 运行 你的源代码。但是,在这种情况下,如果它仍然有效,您需要等待代码完成扫描它的句柄...当然,您需要以完成后关闭的方式编写和执行 python 内容。但是我担心这会增加很大的开销,因为 starting/stopping 单独的 python 过程可能比您测量的矩阵乘法慢得多...
其他选择是以 DLL 或 OBJ 形式将其导入到您的 C/C++ 中(但不确定 Python 代码是否可行)。这样你只需要在你的 C/C++ 应用程序中调用一个函数就没有问题了...
有关灵感,请参阅:
- Builder C++ calling VC++ class
如果代码不太复杂或不需要其他库和东西,您可以尝试将其移植到 C/C++ 代码并直接使用它。
我最好使用 C++ 来执行代码,但我愿意接受任何针对这种情况的更好语言的建议。我基本上想使用 Strassen 算法来求解矩阵,并且我想知道如何求解矩阵并测量其 运行 时间。 # 版本 3.6
import numpy as np
def split(matrix):
"""
Splits a given matrix into quarters.
Input: nxn matrix
Output: tuple containing 4 n/2 x n/2 matrices corresponding to a, b, c, d
"""
row, col = matrix.shape
row2, col2 = row//2, col//2
return matrix[:row2, :col2], matrix[:row2, col2:], matrix[row2:, :col2],
matrix[row2:, col2:]
def strassen(x, y):
"""
Computes matrix product by divide and conquer approach, recursively.
Input: nxn matrices x and y
Output: nxn matrix, product of x and y
"""
# Base case when size of matrices is 1x1
if len(x) == 1:
return x * y
# Splitting the matrices into quadrants. This will be done recursively
# untill the base case is reached.
a, b, c, d = split(x)
e, f, g, h = split(y)
# Computing the 7 products, recursively (p1, p2...p7)
p1 = strassen(a, f - h)
p2 = strassen(a + b, h)
p3 = strassen(c + d, e)
p4 = strassen(d, g - e)
p5 = strassen(a + d, e + h)
p6 = strassen(b - d, g + h)
p7 = strassen(a - c, e + f)
# Computing the values of the 4 quadrants of the final matrix c
c11 = p5 + p4 - p2 + p6
c12 = p1 + p2
c21 = p3 + p4
c22 = p1 + p5 - p3 - p7
# Combining the 4 quadrants into a single matrix by stacking horizontally and vertically.
c = np.vstack((np.hstack((c11, c12)), np.hstack((c21, c22))))
return c
我找到了上面的算法代码。
#include <time.h>
int main(void) {
clock_t tStart = clock();
/* Do your stuff here */
printf("Time taken: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);
return 0;
}
我找到了这个用于测量代码运行时间的代码。但是我看到我可以使用
/usr/bin/time ./MyProgram if I have cygwin installed.
简而言之,我将如何使用我的代码使用 Strassen 算法和其他矩阵求解算法来求解实际矩阵?另外,我将如何 运行 代码?谢谢大家的帮助,我是coding的新手,为了测试不同矩阵求解算法在不同场景下的算法效率,所以才这样做。
时间测量
时间的测量取决于平台那又怎样OS?在 windows 上,我会使用 Performance Counters。如果您可以访问 x86 程序集,您也可以使用 RDTSC 指令,但这需要一些知识才能正确使用,例如将亲和力设置为单个 CPU、获取和稳定 CPU 频率等
OS time granularity 也是一个问题,因此如果您的测量过程太短,您可能需要对多个测量进行一些过滤以获得正确的值。
您可以通过测量该过程的多次重复来避免某些问题,这样时间就会超过 100 毫秒,并将结果时间除以重复次数。
同时重复使用相同的 code/data,同时测量 CACHE can be a problem 太乱了你的结果。
运行宁码
你的代码看起来像 Python 所以你不能直接在 C/C++ 中使用它,而是需要用 Python 解释器以某种方式调用它,例如 creating python process 参数告诉它打开和 运行 你的源代码。但是,在这种情况下,如果它仍然有效,您需要等待代码完成扫描它的句柄...当然,您需要以完成后关闭的方式编写和执行 python 内容。但是我担心这会增加很大的开销,因为 starting/stopping 单独的 python 过程可能比您测量的矩阵乘法慢得多...
其他选择是以 DLL 或 OBJ 形式将其导入到您的 C/C++ 中(但不确定 Python 代码是否可行)。这样你只需要在你的 C/C++ 应用程序中调用一个函数就没有问题了...
有关灵感,请参阅:
- Builder C++ calling VC++ class
如果代码不太复杂或不需要其他库和东西,您可以尝试将其移植到 C/C++ 代码并直接使用它。