C#调用Intel MKL cblas_dgemm_batch
我可以致电Intel Mkl cblas_dgem 在C#中,请参见以下代码: [DllImport("custom_mkl", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, SetLastError = false)] internal static extern void cblas_dgemm( int Order, int TransA, int TransB, MKL_INT M, MKL_INT N, MKL_INT K, double alpha, [In] double[,] A, MKL_INT lda, [In] double[,] B, MKL_INT ldb, double beta, [In, Out] double[,] C, MKL_INT ldc); 和 void cblas_dgemm (const CBLAS_LAYOUT L
22 2024-04-26
编程技术问答社区
带线程的矩阵乘法
我想乘法矩阵.当我使用并行使用时,单线线比多线程慢.但是当我使用两个线程时,单线线程比两个线程快. 我想使用两个线程使用乘法矩阵.我的错误是什么?我不明白.谢谢您的回答. class carp { double[,] a = new double[300, 300]; double[,] b = new double[300, 300]; double[,] c = new double[300, 300]; int indis = 0; public carp(double[,] a, double[,] b, double[,] c,int i) { this.a = a; this.b = b; this.c = c; indis = i; } public void matrixloop() {
4 2024-04-26
编程技术问答社区
如何在C#中对矩阵进行乘法?
我无法获得此方法的工作.它打算将矩阵乘以给定的矩阵.有人可以帮我纠正吗? class Matriz { public double[,] structure; //Other class methods public void multiplyBy(Matrix m) { if (this.structure.GetLength(1) == m.structure.GetLength(0)) { Matriz resultant = new Matriz(this.structure.GetLength(0), m.structure.GetLength(1)); for (int i = 0; i
8 2024-04-14
编程技术问答社区
为什么.NET中的矩阵乘法如此缓慢?
我不太了解是什么使C#/.Net(甚至Java)中的矩阵乘法如此慢. 看一下这个基准( c#的整数和双重性能与MSVC ++编译的C ++相似.在32位整数中,双倍的速度为87%,而99%的速度为99%.该死的很好,我会说.但是,请查看矩阵乘法.差距扩大到C#的速度约为19%.这是我不明白的非常巨大的差异.矩阵乘法只是一堆简单的数学.怎么这么慢?它不应该像简单数量的简单浮点或整数操作一样快吗? 这尤其引起了游戏和XNA的关注,在XNA中,矩阵和向量性能对于物理引擎等事情至关重要.不久前,Mono通过一些漂亮的向量和矩阵类添加了对SIMD指令的支持.它缩小差距并比手写的C ++更快,尽管与SIMD不如C ++快. ( source ) ) 这里发生了什么? 编辑:仔细观察,我误读了第二个图. C#看起来很近. 第一个基准是在做可怕的事情吗?对不起,我错过了第一个基准上的版本编号.我将其作为方便的参考,用于我一直听到的" C#线性代数很慢".我会尝试找到另一个.
4 2024-04-12
编程技术问答社区
为什么2048x2048与2047x2047的阵列乘法有巨大的性能冲击?
我正在制作一些矩阵乘法基准测试,如前所述 为什么Matlab在矩阵乘法中如此快? 现在我遇到了另一个问题,在乘以两个2048x2048矩阵时,C#和其他矩阵之间存在很大的区别.当我尝试仅乘以2047x2047矩阵时,似乎正常. 也添加了其他一些. 1024x1024-10秒. 1027x1027-10秒. 2047x2047-90秒. 2048x2048-300秒. 2049x2049-91秒. (更新) 2500x2500-166秒 那是2K乘2K的三分半分钟. 使用2DIM阵列 //Array init like this int rozmer = 2048; float[,] matice = new float[rozmer, rozmer]; //Main multiply code for(int j = 0; j
2 2024-04-11
编程技术问答社区
使用除法和征服法的矩阵乘法
我是编程的初学者,刚刚学习了新概念,并开始为矩阵乘法编写代码,但是我对指针和其他人感到困惑,所以我在此处将代码上传到了寻求指南中. #include #include int **matrixMultiply(int A[][8], int B[][8], int row); int main() { int **A = allocate_matrix(A, 8, 8); int **B = allocate_matrix(B, 8, 8); int i, j; for (i = 0; i
10 2024-04-10
编程技术问答社区
使用OpenMP进行稀疏矩阵乘法的缓存管理
我认为我认为某个错误的缓存问题,与不是无与伦比的版本相比,我只会在使用以下代码时获得较小的加速. 矩阵1和矩阵2是带有(行,col,val)格式的结构中的稀疏矩阵. void pMultiply(struct SparseRow *matrix1, struct SparseRow *matrix2, int m1Rows, int m2Rows, struct SparseRow **result) { *result = malloc(1 * sizeof(struct SparseRow)); int resultNonZeroEntries = 0; #pragma omp parallel for atomic for(int i = 0; i
8 2024-04-09
编程技术问答社区
使用多线程的矩阵乘法?
我应该使用螺纹乘以2个矩阵.两件事:运行程序时,我一直在0.我还会收到消息错误(对于每个说明"警告:通过不兼容的指针类型"的"警告:传递参数1"(在我尝试打印输出)上. ,这是我试图解决问题的尝试.我认为我很亲密,但我可能不是.有人可以帮忙吗?谢谢:) 输出看起来像这样: a = 1 4 2 5 3 6 b = 8 7 6 5 4 3 a*b = 0 0 0 0 0 0 0 0 0 #include #include #include #define M 3 #define K 2 #define N 3 struct v { int i; //row int j; //column }; int A[M][K] = {{1,4},{2,5},{3,6}}; int B[K][N] = {{8,7,6},{5,4,3}}; int C[M][N]; void *workerThread(voi
4 2024-04-08
编程技术问答社区
MPI矩阵-向量-乘法的返回值有时正确有时奇怪
我有以下代码: //Start MPI... MPI_Init(&argc, &argv); int size = atoi(argv[1]); int delta = 10; int rnk; int p; int root = 0; MPI_Status mystatus; MPI_Comm_rank(MPI_COMM_WORLD, &rnk); MPI_Comm_size(MPI_COMM_WORLD, &p); //Checking compatibility of size and number of processors assert(size % p == 0); //Initialize vector... double *vector = NULL; vector = malloc(size*sizeof(double)); double *matrix = NULL; //Rank 0 -----------------------------
4 2024-04-08
编程技术问答社区
为什么不存在<cblas.h>这样一个文件或目录?
我在C中进行了一些矩阵乘法,我正在尝试编译我的progam,但是由于原因: 没有此类文件或目录CBLA.H 这是我要编译的命令: gcc -o BLAS BLAS.c 有人可以帮我吗?我正在服务器上编译此程序.我不确定这是否有所作为. 解决方案 您需要添加-I directory选项,其中directory是cblas.h文件位于系统上的地方. 这给出了: gcc -o BLAS -I directory_of_cblas_header BLAS.c 其他解决方案 您必须在所使用的库的标头文件中添加路径.使用-I选项尝试: gcc -o -I "path/to/you/headers" BLAS BLAS.c 其他解决方案 我正在使用redhat7. 安装sudo yum install openblas-devel 安装OpenBlas之后 我发现标题文件(cblas.h,f77blas.h,lapacke_conf
4 2024-04-08
编程技术问答社区
大型密集矩阵乘法的循环翻转/阻塞
我想知道是否有人可以向我展示如何有效地使用循环瓷砖/环阻塞来有效地进行大型密集矩阵乘法.我正在使用1000x1000矩阵进行 c = ab .我遵循了Wikipedia上的示例以进行循环瓷砖,但是使用平铺比没有瓷砖的结果更糟. http://en.wikipedia.org/wiki/wiki/loop_tiling http://software.intel.com/en-us/articles/how-to-to-use-use-loop-blocking-to-poptimize-memory-use-use-us-on-32-bit-intel-体系结构 我在下面提供了一些代码.由于缓存错过,幼稚的方法非常慢.转置方法创建了缓冲液中 b 的转置.此方法给出了最快的结果(矩阵乘法如O(n^3),而转置为O(n^2),因此进行转置至少速度至少1000倍).没有阻塞的Wiki方法也很快,不需要缓冲区.阻止方法较慢.阻止的另一个问题是必须多次更新块.这是螺纹/OpenMP的
2 2024-04-07
编程技术问答社区
带有散点收集的MPI矩阵乘法
我正在尝试使用C中的MPI进行矩阵乘法,我们必须执行一个顺序的版本和一个并行版本.我的并行版本没有给出正确的答案,我不确定为什么.我认为我没有将正确的通信发送到流程,但我不确定.教授刚刚浏览了不同的发送/接收/收集等消息,但并没有真正详细介绍...我已经看到了很多不同的示例,但没有完成,也没有使用散点/收集.如果有人可以查看我的代码,并告诉我是否有任何弹出的东西,我会很感激.我很确定我的问题在于散布/收集消息或C矩阵的实际计算. #define N 512 #include #include #include #include #include #include "mpi.h" print_results(char *prompt, float a[N][N]); int main(int argc, char *argv[]) { int i, j, k,
14 2024-04-07
编程技术问答社区
SSE矩阵-矩阵乘法
我在c. 这是我到目前为止得到的: #define N 1000 void matmulSSE(int mat1[N][N], int mat2[N][N], int result[N][N]) { int i, j, k; __m128i vA, vB, vR; for(i = 0; i
10 2024-04-07
编程技术问答社区
矩阵乘法CUDA
我一直在阅读多个网站,甚至使用Matrix A 0.000000 8.000000 2.000000 2.000000 Matrix B 3.000000 1.000000 5.000000 7.000000 Matrix C (Results) 0.000000 9.000000 7.000000 4.000000 但这是不正确的.应该是: 40.000 56.000 16.000 16.000 我将其从小数更改为整数,以便更容易检查,并且发现它是不正确的.我不明白为什么它是不正确的,尤其是即使我从他们的代码样本中获取它. #ifndef _MATRIXMUL_KERNEL_H_ #define _MATRIXMUL_KERNEL_H_ #include // Thread block size #define BLOCK_SIZE 16 #define TILE_SIZE 16 // CUDA Kernel __global__
4 2024-04-07
编程技术问答社区