【问题标题】:Matrix initialization not working with higher values矩阵初始化不适用于更高的值
【发布时间】: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 &lt; 100时有效;

对于m &lt; 100,它会在i = 97 处引发分段错误。

我能够使用完全相同的代码使用边 2^12 的矩阵。

我的系统配置 - RAM 16GB 2667 MT/s、i7 9750h 和 RTX 2070。

【问题讨论】:

  • 在 C++ 中使用 malloc 的原因是什么?
  • i*m + j 是计算线性索引的错误方法。
  • RAM 16GB -- 如果你的应用程序是 32 位的,那么内存对你没有好处,只是说。 64 位应用程序可以利用该内存。

标签: c++ memory malloc


【解决方案1】:
a[i*m + j] = 1.0f;

这个数学是错误的。使用i 表示行和j 表示列的术语,每行有k 值,因此应该是:

a[i*k + j] = 1.0f;

【讨论】:

  • 天哪,是的,非常感谢您指出这一点。我最近遇到了一些硬件问题,吓坏了。不过很抱歉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多