诡异的结果

下面这段代码用来求0到14的平方,我运行的结果是

0.000000 1.000000 4.000000 9.000000 16.000000 25.000000 36.000000 49.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000

后面几组全部变成0了,不知道是为什么



#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<cutil.h>
#include <cutil_inline.h>

const int N=15;

float* a;
float* d_a;

__global__ void test(float* vec1, float* res){
	extern __shared__ float sh_vec[];
	int id=threadIdx.x;
	int num=blockDim.x;
	int taskPerThread=(N+num-1)/num;
	int pos=id*taskPerThread;
	for(int i=0;i<taskPerThread;++i){
		if(pos+i<N){
			sh_vec[pos+i]=vec1[pos+i];
		}
	}
	__syncthreads();
	for(int i=0;i<taskPerThread;++i){
		if(pos+i<N){
			res[pos+i]=sh_vec[pos+i];
		}
	}
	__syncthreads();
	return;
}


int main(){
	int size=N*sizeof(float);
	a=(float*)malloc(size);
	for(int i=0;i<N;++i)
		a[i]=i*i;
	CUDA_SAFE_CALL(cudaMalloc((void**)&d_a,size));
	CUDA_SAFE_CALL(cudaMemcpy(d_a,a,size,cudaMemcpyHostToDevice));
	dim3 dg(1,1,1);
	dim3 db(10,1,1);
	test<<<dg,db,0>>>(d_a,d_a);
	CUDA_SAFE_CALL(cudaMemcpy(a,d_a,size,cudaMemcpyDeviceToHost));
	for(int i=0;i<N;++i){
		printf("%f ",a[i]);
	}
	printf("\n");
	free(a);
	CUDA_SAFE_CALL(cudaFree(d_a));
	return 0;
}


共享内存的使用上有错,其实就是算法运用不当,如果想得到更明确的回答,就把算法具体情况说清楚

额,我是写了一个向量相加的函数,怎么都不对,始终只有前8个元素非0,单步检查变量就发现了这个问题。

于是写了上面这个程序来检测,算法就是把host上的数组a拷贝到device上,然后再拷贝回host

基本就是

a—>d_a—>shared-mem–>d_a–>a

[

什么地方有错呢

你在内核里声明共享存储器时,用的extern,但是你在调用时,对应的参数为0,也就是没有使用共享存储器,呵呵!这就是错误

[

用driver api的时候如果内核中只声明了有一个共享内存块(用extern方式声明),且每个块锁使用的共享内存都不超出限制,则即使不显式调用API静态分配共享内存,也不会出错。这是以前某个时候偶然发现的

不过RT API应该也一样

有过类似的经验,但是我记得是不可靠的,有的时候可以,有的时候不行,呵呵!

:frowning: