高数字导致seg故障

时间:2012-02-17 21:07:30

标签: c++ c memory

这段代码来自我正在编写的程序,用于获取x col和x行以在CUDA上运行矩阵乘法,并行处理。样本量越大越好。

我有一个自动生成x个随机数的函数。

我知道答案很简单,但我只想知道原因。但是当我用数组中的625000000个元素运行它时,它会出现故障。我认为这是因为我已经超过了内存允许的大小。

对于较大的数字,我应该使用什么数据类型代替int? 这是数据的分配方式,然后传递给函数。

a.elements = (float*) malloc(mem_size_A);

,其中

int mem_size_A = sizeof(float) * size_A; //for the example let size_A be 625,000,000

通过:

randomInit(a.elements, a.rowSize,a.colSize, oRowA, oColA);

randomInit正在做的是说我输入2x2但是我将它填充到16的倍数。所以需要2x2并将矩阵填充到16x16的零并且2x2仍然存在。

void randomInit(float* data, int newRowSize,int newColSize,  int oldRowSize, int oldColSize)
{
    printf("Initializing random function. The new sized row is %d\n", newRowSize);
    for (int i = 0; i < newRowSize; i++)//go per row of new sized row.
    {
        for(int j=0;j<newColSize;j++)
        {
            printf("This loop\n");
            if(i<oldRowSize&&j<oldColSize)
            {
                data[newRowSize*i+j]=rand() / (float)RAND_MAX;//brandom();
            }
            else
                data[newRowSize*i+j]=0;
        }
    }
}

我甚至在循环中使用printf运行它。这是我得到的结果:

Creating the random numbers now
Initializing random function. The new sized row is 25000
This loop
Segmentation fault

3 个答案:

答案 0 :(得分:1)

data的内存分配可能失败。

幸运的是,您几乎肯定不需要存储大量随机数。

而不是存储:

data[n]=rand() / (float)RAND_MAX

对于n的大量集合,您可以运行:

srand(n);
value = rand() / (float)RAND_MAX;

当你需要一个特定的数字时,你每次都会得到相同的值,好像它们都是事先计算好的。

答案 1 :(得分:0)

我认为你已超过为data分配的价值。当你的newrowsize太大时,你正在访问未分配的内存。

请记住,data并非无限大。

答案 2 :(得分:-2)

真正的问题是,如果问题实际上是用于阵列访问的整数大小,那么您将无法修复它。我想你可能只是在你的记忆中没有足够的空间来存储大量的数据。

如果要扩展它,只需定义一个自定义结构或类(如果您使用的是C ++)。但是你将失去与数组有关的O(1)时间访问复杂性。