Memory cudaFree并没有释放内存
下面的代码计算两个向量a和b的点积。正确的结果是8192。当我第一次运行它时,结果是正确的。然后,当我第二次运行它时,结果是前一个结果+8192,依此类推: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没有被释放。更重要的是写入它会导致一个和,结果是前一个值加上写入它的新
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;icudaFree不会擦除任何内容,它只是将内存返回到要重新分配的池中。Cudamaloc不保证已分配的内存值。您需要初始化程序使用的内存(全局内存和共享内存),以获得一致的结果。顺便说一句,这同样适用于 内存未被清除
这意味着dev_c没有初始化,并且您的
atomicAdd(c,sum)
将添加到存储在内存中返回位置的任意随机值。我在内核中初始化了共享变量,它的工作方式很好。谢谢@兹维巴,我也有同样的问题。你能告诉我你是如何在内核中初始化的吗?如果我们在内核内部初始化,不是每个线程都会重置该值吗?提前谢谢你。@RajindRuparathna,那是三年前的事了,从那以后我就再也没碰过Cuda了。抱歉。使用初始化数组执行CUDAEMCPY对我有效。cudaMemcpy(dev_c,c,size,cudamemcpyhostodevice);其中,使用for循环将数组中的c初始化为零。