#include<stdio.h>
#define N 100
global void add(int *a,int *b,int *c)
{
int tid=blockIdx.x;
if(tid<N)
c[tid]=a[tid]+b[tid];
}
int main()
{
int arr1[N],arr2[N];
int sum[N];
for(int i=0;i<N;i++)
{
arr1[i]=i;
arr2[i]=i+1;
}
int *a;
int *b;
int *res;
cudaMalloc((void**)&res,sizeof(int)*N);
cudaMalloc((void**)&a,sizeof(int)*N);
cudaMalloc((void**)&b,sizeof(int)*N);
cudaMemcpy(a,arr1,sizeof(int)*N,cudaMemcpyHostToDevice);
cudaMemcpy(b,arr2,sizeof(int)*N,cudaMemcpyHostToDevice);
add<<<N,1>>>(a,b,res);
cudaMemcpy(sum,res,sizeof(int)*N,cudaMemcpyDeviceToHost);
for(int i=0;i<N;i++)
printf(“%d\n”,sum[i]);
cudaFree(a);
cudaFree(b);
//for test
//scanf(“%d”,&sum);
上边是CUDA的代码,下边是C的代码,为什么C编译出来的执行速的会快啊?c的结果用户时间是0.000s cuda是0.002s
#include<stdio.h>
#define N 100
int main()
{
int arr1[N],arr2[N];
int sum[N];
int i;
for( i=0;i<N;i++)
{
arr1[i]=i;
arr2[i]=i+1;
}
for( i=0;i<N;i++)
{
sum[i]=arr1[i]+arr2[i];
printf(“%d\n”,sum[i]);
}
}
有没有高手给分析一下?是不是CUDA不善长数据的拷贝,
如果是这样的话,内存中的字符串数组实现排序,是不是用cuda实现不了?
LZ您好,大致看了一下,我觉得主要有3个原因。
1:您的计算过于简单,基本上都是来回copy的任务。这样GPU受限于来回copy的开销,比CPU慢非常正常。
2:您的计算规模太小,只有几百个数相加而已,现代CPU对于这个规模的计算都是瞬间完成的,可能比你调用CUDA RUNTIME API的耗时开销还要短。
3:您在invoke kernel 的时候,使用了<<<N,1>>>的参数,每个block里面只有1个线程,此时GPU的利用率极为低下。
综上所述,我认为这3点原因造成了您的测试结果。
以及如果您实际问题只是这个规模的话(而不是因为调试故意缩小了规模),那么建议您直接CPU实现吧。
大致如上,祝您编码顺利~
CUDA如果需要从host 来回copy数据的话,会受到pci-e总线速度的影响。以及如果数据量很小的话,各种开销的时间会大为超过实际的计算时间。
以及,无法理解您“如果是这样的话,内存中的字符串数组实现排序,是不是用cuda实现不了?”的结论。因为copy速度快慢和实现正确性与否是无关的,只和实现效率有关,而实现效率又和很多其他因素有关,需要具体讨论。
大致如此,祝您好运~
ice版主回答的好全面,受益匪浅,
本人是做流通IT的,主要是面对庞大数据量处理的,
在一些结构化数据的排序,计算,以及数据压缩解压方面想找一些突破的方法,
再看CUDA的成功案例的地方,基本上看到的都是计算方面的,力学,流体动力等等,
好像金融方面只有一个,在数据量以及结构化数据方面可能和流通IT有相似之处吧:loveliness: