【发布时间】:2021-06-19 15:44:15
【问题描述】:
我必须初始化一个矩阵,该矩阵稍后必须传递给 Cuda 内核。但是当我初始化矩阵时出现分段错误。代码如下-
#include <iostream>
int main(){
size_t m = 512;
size_t k = 32;
size_t n = 32;
float* a = (float*) malloc(m * k * sizeof(float));
if(a == nullptr){
std::cout<<"Nullptr returned, Check Memory Hardware"<<std::endl;
exit(-1);
}
for(size_t i=0; i<m; i++){
std::cout<<i<<std::endl;
for(size_t j=0; j<k; j++){
std::cout<<j<<" ";
a[i*m + j] = 1.0f;
}
std::cout<<std::endl<<"=-=-=-=-=-=-=-=- ||||| =-=-=-=-=-=-=-=-=-=-=-=-=-"<<std::endl;
}
}
代码仅在m < 100时有效;
对于m < 100,它会在i = 97 处引发分段错误。
我能够使用完全相同的代码使用边 2^12 的矩阵。
我的系统配置 - RAM 16GB 2667 MT/s、i7 9750h 和 RTX 2070。
【问题讨论】:
-
在 C++ 中使用 malloc 的原因是什么?
-
i*m + j是计算线性索引的错误方法。 -
RAM 16GB-- 如果你的应用程序是 32 位的,那么内存对你没有好处,只是说。 64 位应用程序可以利用该内存。