我对CUDA上的Matrix乘法感到震惊.得到的乘积矩阵始终为零.我已经阅读了一些示例代码,例如cuda中的矩阵乘法来解决我的问题,但都是徒劳的.
除了0的不稳定结果之外,"宽度"(下面的代码)的最大大小甚至不是512.我无法调试问题所在.也许我们可以在StackOverflow上讨论它.
我指的是"编程大规模并行处理器"
#include<cuda.h>
#include<stdio.h>
int main(void) {
void MatrixMultiplication(float *, float *, float *, int);
const int Width = 5;
float M[Width*Width], N[Width*Width], P[Width*Width];
for(int i = 0; i < (Width*Width) ; i++) {
M[i] = 5;
N[i] = 5;
P[i] = 0;
}
MatrixMultiplication(M, N, P, Width);
for(int i = 0; i < (Width*Width) ; i++) {
printf("%d \n", P[i]);
}
int quit;
scanf("%d",&quit);
return 0;
}
//Matrix multiplication kernel - thread specification
__global__ void MatrixMulKernel(float …Run Code Online (Sandbox Code Playgroud) 根据我对'&'运算符的了解,它返回内存中操作数的基址.
让我们想象下面的场景(就像在我的机器上一样):
现在,如果我写这样的东西:
void main() {
int i = 5411;
int *ip = &i;
char *c = &i;
printf("%d",*ip);
printf("%c",*c);
}
Run Code Online (Sandbox Code Playgroud)
第一个printf()应该给我5411.谈到第二个printf(),i的基地址包含10101001(高阶8位= 1字节用于char类型指针).因此*c应该给我169,转换为%c时是无效字符.
但是编译器给了我'#'或其他一些有效的输出.为什么会这样?有什么投入?
编辑(取自作者对其中一个答案的评论):
那只是一个虚拟案例,因为我离开了实际的机器.
实际情况是i = 5411
这个问题可能看似含糊不清,但让我解释一下.
假设我们有一个函数f(x,y,z ....),我们需要在点(x1,y1,z1 .....)找到它的值.
最简单的方法是将(x,y,z ......)替换为(x1,y1,z1 .....).
现在假设该函数在评估中花费了大量时间,我想并行化算法来评估它.显然它也取决于功能的性质.
所以我的问题是:在"思考"并行化f(x,y,z ......)时,我必须寻找什么约束?
如果可能,请分享学习链接.