Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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
Memory cudaFree并没有释放内存_Memory_Cuda_Free - Fatal编程技术网

Memory cudaFree并没有释放内存

Memory cudaFree并没有释放内存,memory,cuda,free,Memory,Cuda,Free,下面的代码计算两个向量a和b的点积。正确的结果是8192。当我第一次运行它时,结果是正确的。然后,当我第二次运行它时,结果是前一个结果+8192,依此类推: 1st iteration: result = 8192 2nd iteration: result = 8192 + 8192 3rd iteration: result = 8192 + 8192 and so on. 我通过在屏幕上打印来检查,设备变量dev_c没有被释放。更重要的是写入它会导致一个和,结果是前一个值加上写入它的新

下面的代码计算两个向量a和b的点积。正确的结果是8192。当我第一次运行它时,结果是正确的。然后,当我第二次运行它时,结果是前一个结果+8192,依此类推:

1st iteration: result = 8192
2nd iteration: result = 8192 + 8192
3rd iteration: result = 8192 + 8192 
and so on.
我通过在屏幕上打印来检查,设备变量dev_c没有被释放。更重要的是写入它会导致一个和,结果是前一个值加上写入它的新值。我想这可能与atomicAdd()操作有关,但cudaFree(dev_c)终究应该删除它

#define N 8192
#define THREADS_PER_BLOCK 512
#define NUMBER_OF_BLOCKS (N/THREADS_PER_BLOCK)
#include <stdio.h>


__global__ void dot( int *a, int *b, int *c ) {

    __shared__ int temp[THREADS_PER_BLOCK];

    int index = threadIdx.x + blockIdx.x * blockDim.x;

    temp[threadIdx.x] = a[index] * b[index];

    __syncthreads();

    if( 0 == threadIdx.x ) {

        int sum = 0;
        for( int i= 0; i< THREADS_PER_BLOCK; i++ ){
        sum += temp[i];
        }
        atomicAdd(c,sum);
    }
}

    int main( void ) {

        int *a, *b, *c;
        int *dev_a, *dev_b, *dev_c; 
        int size = N * sizeof( int); 

        cudaMalloc( (void**)&dev_a, size );
        cudaMalloc( (void**)&dev_b, size );
        cudaMalloc( (void**)&dev_c, sizeof(int));

        a = (int*)malloc(size);
        b = (int*)malloc(size);
        c = (int*)malloc(sizeof(int));

        for(int i = 0 ; i < N ; i++){
            a[i] = 1;
            b[i] = 1;
        }

        cudaMemcpy( dev_a, a, size, cudaMemcpyHostToDevice);
        cudaMemcpy( dev_b, b, size, cudaMemcpyHostToDevice);

        dot<<< N/THREADS_PER_BLOCK,THREADS_PER_BLOCK>>>( dev_a, dev_b, dev_c);

        cudaMemcpy( c, dev_c, sizeof(int) , cudaMemcpyDeviceToHost);

        printf("Dot product = %d\n", *c);

        cudaFree(dev_a);
        cudaFree(dev_b);
        cudaFree(dev_c);    

        free(a); 
        free(b); 
        free(c);

        return 0;

    }
定义N 8192 #按块512定义线程 #定义块的数量(每个块有N个线程) #包括 __全局无效点(int*a,int*b,int*c){ __共享_uuuint temp[每个_块的线程数]; int index=threadIdx.x+blockIdx.x*blockDim.x; temp[threadIdx.x]=a[index]*b[index]; __同步线程(); 如果(0==threadIdx.x){ 整数和=0; 对于(int i=0;i(开发a、开发b、开发c); cudaMemcpy(c,dev_c,sizeof(int),cudaMemcpyDeviceToHost); printf(“点积=%d\n”,*c); cudaFree(dev_a); cudaFree(dev_b); cudaFree(开发中心); 免费(a); 免费(b); 免费(c); 返回0; }
cudaFree不会擦除任何内容,它只是将内存返回到要重新分配的池中。Cudamaloc不保证已分配的内存值。您需要初始化程序使用的内存(全局内存和共享内存),以获得一致的结果。顺便说一句,这同样适用于

内存未被清除


这意味着dev_c没有初始化,并且您的
atomicAdd(c,sum)
将添加到存储在内存中返回位置的任意随机值。

我在内核中初始化了共享变量,它的工作方式很好。谢谢@兹维巴,我也有同样的问题。你能告诉我你是如何在内核中初始化的吗?如果我们在内核内部初始化,不是每个线程都会重置该值吗?提前谢谢你。@RajindRuparathna,那是三年前的事了,从那以后我就再也没碰过Cuda了。抱歉。使用初始化数组执行CUDAEMCPY对我有效。cudaMemcpy(dev_c,c,size,cudamemcpyhostodevice);其中,使用for循环将数组中的c初始化为零。