Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基本CUDA C程序在特定条件下崩溃_C_Cuda - Fatal编程技术网

基本CUDA C程序在特定条件下崩溃

基本CUDA C程序在特定条件下崩溃,c,cuda,C,Cuda,我正在编写一个基本的CUDA程序,以便更好地理解该语言。我写了一些非常基本的东西,只需并行添加两个向量,并将结果打印到ppm文件中。现在,向量中的值是不相关的,因为我计划稍后调整它以生成某种有趣的图像。问题是图像的分辨率(实际上是结果向量)会导致程序在太大时几乎立即崩溃。考虑现在的程序: #include <stdio.h> #define cols 500 #define rows 50 #define arraySize rows * cols __global__ void

我正在编写一个基本的CUDA程序,以便更好地理解该语言。我写了一些非常基本的东西,只需并行添加两个向量,并将结果打印到ppm文件中。现在,向量中的值是不相关的,因为我计划稍后调整它以生成某种有趣的图像。问题是图像的分辨率(实际上是结果向量)会导致程序在太大时几乎立即崩溃。考虑现在的程序:

#include <stdio.h>

#define cols 500
#define rows 50
#define arraySize rows * cols

__global__ void addOnGPU(int *a, int *b, int *c) {
    // Only use data at this index
    int tid = threadIdx.x + blockIdx.x * blockDim.x;

    if (tid < arraySize) c[tid] = a[tid] + b[tid];
}

int main()
{
    FILE *ppm_fp;
    int a[arraySize], b[arraySize], c[arraySize];
    int *dev_a, *dev_b, *dev_c;
    int i, j;
    int threadsperblock = 256;
    int blocks = (arraySize + threadsperblock - 1) / threadsperblock;

    printf("1\n");
    // Allocate memory on GPU for the three vectors
    cudaError_t cudaStatus = cudaMalloc((void **) &dev_a, arraySize * sizeof(int));
    cudaStatus = cudaMalloc((void **) &dev_b, arraySize * sizeof(int));
    cudaStatus = cudaMalloc((void **) &dev_c, arraySize * sizeof(int));
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "Unable to allocate memory on the GPU!");
        return 1;
    }

    printf("2\n");
    // Assign values to input vectors
    for (i = 0, j = 0; i < arraySize; i++, j++) {
        a[i] = i;
        b[i] = i * i;
    }

    printf("3\n");
    // Copy input values to allocated vectors in GPU memory
    cudaStatus = cudaMemcpy(dev_a, a, arraySize * sizeof(int), cudaMemcpyHostToDevice);
    cudaStatus = cudaMemcpy(dev_b, b, arraySize * sizeof(int), cudaMemcpyHostToDevice);
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "Unable to copy input vectors to the GPU!");
        return 1;
    }

    printf("before\n");
    // Add vectors in parallel and save results in dev_c
    addOnGPU<<<blocks, threadsperblock>>>(dev_a, dev_b, dev_c);
    printf("after\n");

    // Copy results from dev_c to local c vector
    cudaStatus = cudaMemcpy(c, dev_c, arraySize * sizeof(int), cudaMemcpyDeviceToHost);
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "Unable to copy input vectors to the GPU!");
        return 1;
    }

    ppm_fp = fopen("image.ppm", "wb");
    fprintf(ppm_fp, "P6\n%d %d\n255\n", cols, rows);
    for (i = 0; i < arraySize; i++) {
        if (i % (3 * cols) == 0) fprintf(ppm_fp, "\n");
        fprintf(ppm_fp, "%d ", c[i]);
    }

    // Display contents of output vector
    for (i = 0; i < arraySize; i++) {
        printf("%d + %d = %d\n", a[i], b[i], c[i]);
    }
    printf("\n");

    // cudaDeviceReset must be called before exiting in order for profiling and
    // tracing tools such as Nsight and Visual Profiler to show complete traces.
    cudaStatus = cudaDeviceReset();
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaDeviceReset failed!");
        return 1;
    }

    return 0;
}
#包括
#定义cols 500
#定义第50行
#定义数组化行*列
__全局_uuuuu无效addOnGPU(int*a,int*b,int*c){
//仅使用此索引处的数据
int tid=threadIdx.x+blockIdx.x*blockDim.x;
如果(tid
目前,程序使用cols和rows的值运行良好。如果我将行数增加到500,那么程序将崩溃。我已经包括了一些调试打印语句,试图找到它崩溃的地方,但一旦我运行它,它就会崩溃。我在VisualStudio2013上运行它(我是使用它的新手,更熟悉VI、linux和手动编译)。我有一个GTX 580 3GB版本,如果这很重要的话。我知道我不可能超过任何内存限制,并且我没有超过可以创建的块的65536(或者是65535)限制,或者每个块的线程数的512限制。你知道哪里出了问题吗


谢谢

您观察到的崩溃与CUDA无关,是由于C/C++静态数组分配达到内存限制所致

int a[arraySize], b[arraySize], c[arraySize];
静态分配的数组被放入内存堆栈中,内存堆栈通常有大小限制。由语法动态分配的数组

int* a = (int*)malloc(arraySize*sizeof(int));
被放入内存堆中,通常在程序执行过程中,当需要更多内存时,内存堆会增加。与此相反,由于管理动态内存分配的开销,堆内存比堆栈内存慢

您可以在web上找到许多有用的资料,解释堆栈和堆内存之间的差异,例如,请参阅

还有StackOverflow保护问题

作为结束语,我要说的是,按照帖子的意思,进行适当的CUDA错误检查总是很好的


这一点现在也在文章中提到。这可能有助于您自己排除CUDA错误。

您观察到的崩溃与CUDA无关,是由于C/C++静态数组分配达到内存限制所致

int a[arraySize], b[arraySize], c[arraySize];
静态分配的数组被放入内存堆栈中,内存堆栈通常有大小限制。由语法动态分配的数组

int* a = (int*)malloc(arraySize*sizeof(int));
被放入内存堆中,通常在程序执行过程中,当需要更多内存时,内存堆会增加。与此相反,由于管理动态内存分配的开销,堆内存比堆栈内存慢

您可以在web上找到许多有用的资料,解释堆栈和堆内存之间的差异,例如,请参阅

还有StackOverflow保护问题

作为结束语,我要说的是,按照帖子的意思,进行适当的CUDA错误检查总是很好的


这一点现在也在文章中提到。它可能会帮助您自己排除CUDA错误。

我怀疑您已经达到了静态分配内存的极限。尝试使用
malloc
将静态分配
a[arraySize]
b[arraySize]
c[arraySize]
更改为动态分配。我同意@jackolanten。你的代码有效吗