新手求教啊 显示错误

global void fillKernel(int a, int n)
{
int tid = blockIdx.x
blockDim.x + threadIdx.x;
if (tid < n) a[tid] = tid;
cout<<a[tid]<<" ";
}

为何出现错误
错误 2 error : calling a host function(“std::basic_ostream<char, std::char_traits >::operator <<”) from a device/global function(“fillKernel”) is not allowed D:\My Documents\Documents\Visual Studio 。。

LZ您好,您不能在kernel里面使用cout的。

请您修改。

祝您好运~

这样啊。那我想显示每一个数组元素该怎么写啊??

如果一定要在kernel里面输出的话,可以使用printf。
以及线程之间的顺序是不被保证的,也就是说是乱序的,您需要注意。

祝您好运~

:)受益匪浅啊!感谢指导!!!

为何又出现这样的错误啊、貌似不行啊

错误 2 error : calling a host function(“printf”) from a device/global function(“fillKernel”) is not allowed

您好,需要stdio.h这个头文件,以及在编译的时候需要指定计算能力在2.0或者更高的版本。

printf的示例性用法请参看 programming guide。

这个一定可用的,请放心。

祝您好运!

:)感谢指导。
还想问一下,这个计算能力怎么来设定呢?

这个计算能力是显卡硬件来决定的吗?还是说可以手动更改?

LZ您好,在编译的时候,计算能力是可以随意指定的,编译器将根据您指定的一个或者多个不同的计算能力编译出相应的执行二进制码。

只有编译的时候指定sm_20或者更高,才能在kernl里面使用printf。

以及根据相应计算能力编译出来的代码,需要对应的计算能力的显卡来执行。(暂不考虑内嵌PTX jit的作用)如果您的代码是为2.x编译的,kernel里面使用了printf,但是您的显卡是1.x计算能力的,那么将无法运行您的代码。

以及,您具体的卡有自己的计算能力版本,fermi核心的是2.x的,kepler核心的是3.x的,这两个架构都可以在kernel里面使用printf,更低计算能力版本的显卡不可以。

大致如此,供您参考,祝您好运~

懂了。感谢版主指点。:lol

其实我想写一个这样的程序:假设有一个5位数组 ,每一位的取值可以从0-10,然后显示出一共有多少种可能。不知道kernel该如何构建:dizzy:

LZ您好,本版一般只提供CUDA的支持,不直接讨论/给出某个具体实际问题的具体实现,请您在学习CUDA之后,自行考虑您的代码实现,届时,如有疑问,可以讨论。

以及如果您只需要知道有多少种可能的话,这是一个典型的排列问题,有具体的解析公司可用。

大致如此,供您参考,祝您好运!

:)好的。感谢版主