Tag: 矩阵

矩阵乘法与块

这是我加速矩阵乘法的代码,但它比简单乘法快5%。 我能做些什么来尽可能地提升它? *正在访问这些表格,例如: C [i,j,n]]用于C [i,j]位置。 void matrixMultFast(float * const C, /* output matrix */ float const * const A, /* first matrix */ float const * const B, /* second matrix */ int const n, /* number of rows/cols */ int const ib, /* size of i block */ int const jb, /* size […]

一个更好的8×8字节矩阵转置与SSE?

我发现这篇文章解释了如何通过24次操作转置8×8字节矩阵,稍后会有几个滚动条实现转置。 但是,这种方法没有利用我们可以阻止 8×8转置为4个4×4转置的事实,并且每个转换只能在一个shuffle指令中完成( 这篇文章是参考文献)。 所以我推出了这个解决方案: __m128i transpose4x4mask = _mm_set_epi8(15, 11, 7, 3, 14, 10, 6, 2, 13, 9, 5, 1, 12, 8, 4, 0); __m128i shuffle8x8Mask = _mm_setr_epi8(0, 1, 2, 3, 8, 9, 10, 11, 4, 5, 6, 7, 12, 13, 14, 15); void TransposeBlock8x8(uint8_t *src, uint8_t *dst, int srcStride, int dstStride) { __m128i load0 […]

CUDA:平铺矩阵 – 矩阵乘法,共享内存和矩阵大小,是块大小的非倍数

我正在尝试熟悉CUDA编程,并且有一段非常有趣的时间。 我目前正在研究这个 pdf,它处理矩阵乘法,有和没有共享内存。 这两个版本的完整代码都可以在这里找到。 该代码几乎与CUDA矩阵乘法样本中的代码完全相同。 虽然非共享内存版本具有以任何矩阵大小运行的能力,但无论块大小如何,共享内存版本必须与块大小的倍数(我设置为4,默认最初为16)的矩阵一起使用。 pdf末尾提出的问题之一是更改它,以便共享内存版本也可以使用块大小的非倍数。 我认为这将是一个简单的索引检查,就像在非共享版本中一样: int row = blockIdx.y * blockDim.y + threadIdx.y; int col = blockIdx.x * blockDim.x + threadIdx.x; if(row > A.height || col > B.width) return; 但这不起作用。 这是完整的代码,减去主要的方法(有点乱,对不起),我已经有所修改了: void MatMul(const Matrix A, const Matrix B, Matrix C) { // Load A and B to device memory Matrix d_A; d_A.width […]

在MXN矩阵中查找amxn子矩阵的最快方法

我在考虑一种快速的方法来在更大的矩阵M中寻找子矩阵m。我还需要识别部分匹配。 我能想到的几种方法是: 优化正常的暴力,只处理增量的行和列。 可能会将Rabin-karp算法扩展到2-d但不确定如何处理它的部分匹配。 我相信这是图像处理中经常遇到的问题,如果有人可以投入他们的意见或指向我关于这个主题的资源/论文,我将不胜感激。 编辑:较小的例子: 更大的矩阵: 1 2 3 4 5 4 5 6 7 8 9 7 6 5 2 较小的矩阵: 7 8 5 2 2 结果:(行:1列:3) 较小矩阵的一个例子,它在(1,3)处有资格作为部分匹配: 7 9 5 2 2 如果超过一半像素匹配,则将其视为部分匹配。 谢谢。

将矩阵传递给函数,C

环顾四周后,我已经构建了一个接受矩阵并执行我需要的任何function的函数,如下所示: float energycalc(float J, int **m, int row, int col){ … } 在main中,定义并填充了数组的大小,但是我不能将它传递给函数本身: int matrix[row][col]; … E=energycalc(J, matrix, row, col); 这会在编译期间产生警告 “project.c:149:警告:从不兼容的指针类型project.c传递’energycalc’的参数2:53:注意:期望’int **’但参数的类型为’int(*)[(long unsigned int) (col + -0x00000000000000001)]’ 并导致分段错误。 非常感谢任何帮助,谢谢。

如何将简单指针转换为固定大小的多维数组?

我有一个函数,它采用指向浮点数组的指针。 基于其他条件,我知道指针实际上指向2×2 OR 3×3矩阵。 (实际上内存最初是这样分配的,例如float M [2] [2])重要的是我想在函数体中做出这个决定,而不是作为函数参数。 void calcMatrix( int face, float * matrixReturnAsArray ) { // Here, I would much rather work in natural matrix notation if( is2x2 ) { // ### cast matrixReturnAsArray to somethingAsMatrix[2][2] somethingAsMatrix[0][1] = 2.002; // etc.. } else if(is3x3) { //etc… } } 我知道我可以使用模板和其他技术来更好地解决这个问题。 我的问题是关于如何在###评论中进行这样的演员表。 使用C ++。

为什么指针指针是一个矩阵?

我知道在某些情况下,指向指针的指针被描述为矩阵。 有人可以解释一下,为什么这种方式有效? 哪个C属性允许它? 请不要发布指针这样的答案指针并不总是矩阵。 我知道,但我想问为什么它在某些情况下是一个矩阵。

在C中将内存分配给char ***

所以,我在为char ***类型变量分配内存时遇到了麻烦。 我的目标是创建一个字符串矩阵,我目前用于内存分配的代码如下: char ***matrix; matrix = calloc(n*MAX_STR, sizeof(char**)); for(z = 0; z < n; z++) { matrix[z] = calloc(n, sizeof(char*)); for(i = 0; i < MAX_STR; i++) { matrix[z][i] = calloc(MAX_STR, sizeof(char)); } } 我已成功为字符串数组分配内存,使用: char **list; list = calloc(n, sizeof(char *)); for (j = 0; j < n; j++){ list[j] = calloc(MAX_STR, sizeof(char)); […]

在函数中传递矩阵(C)

我有一个问题将矩阵传递给C中的函数。我想要创建的函数: void ins (int *matrix, int row, int column); 但我注意到与矢量相反,矩阵给我一个错误。 如何将矩阵传递给函数呢? 编辑 – >有代码: // Matrix #include #define SIZE 100 void ins (int *matrix, int row, int column); void print (int *matrix, int row, int column); int main () { int mat[SIZE][SIZE]; int row, col; printf(“Input rows: “); scanf (“%d”, &row); printf(“Input columns: “); scanf […]

在位上旋转8×8块中的位的最快方法是什么?

我不确定我正在尝试做什么的确切术语。 我有一个以8 bytes字节存储的8×8 bits块,每个字节存储一行。 当我完成后,我希望每个字节存储一列。 例如,当我完成时: Byte0out = Byte0inBit0 + Byte1inBit0 + Byte2inBit0 + Byte3inBit0 + … Byte1out = Byte0inBit1 + Byte1inBit1 + Byte2inBit1 + Byte3inBit1 + … 在C中表现良好的最简单方法是什么?