Tag: cuda

是否可以将汇编指令放入CUDA代码中?

我想在CUDA C代码中使用汇编代码,以减少昂贵的执行,因为我们在c编程中使用asm 。 可能吗?

从cuda内核打印

我正在编写一个cuda程序,并尝试使用printf函数在cuda内核中打印一些内容。 但是当我编译程序时,我收到了一个错误 error : calling a host function(“printf”) from a __device__/__global__ function(“agent_movement_top”) is not allowed error MSB3721: The command “”C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\bin\nvcc.exe” -gencode=arch=compute_10,code=\”sm_10,compute_10\” –use-local-env –cl-version 2008 -ccbin “c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin” -I”C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.2\C\common\inc” -I”C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include” -G –keep-dir “Debug” -maxrregcount=0 –machine 32 –compile -g -Xcompiler […]

Cuda从设备存储器创建3d纹理和cudaArray(3d)

我试图从设备arrays的一部分创建纹理3d。 要做到这一点,这些是我的步骤: malloc设备arrays 写设备arrays 创建CudaArray(3D) 将纹理绑定到CudaArray 我这样做的方式不会产生编译器错误,但是当我运行cuda-memcheck时,当我试图从纹理中获取数据时,它失败了。 无效的全局读取大小为8 ..地址0x10dfaf3a0超出范围 这就是为什么我猜我宣布纹理数组错了。 这是我如何访问纹理: tex3D(NoiseTextures [I]中,X,Y,Z) 我正在做上述步骤的方式: 1.Malloc设备arrays cudaMalloc((void **)&d_Noise, sqrSizeNoise*nNoise*sizeof(float)); 2.编写设备arrays curandCreateGenerator(&gen,CURAND_RNG_PSEUDO_DEFAULT); curandSetPseudoRandomGeneratorSeed(gen,Seed); curandGenerateUniform(gen, d_Noise, sqrSizeNoise*nNoise); curandDestroyGenerator(gen); 3 + 4.创建Cudaarrays并将其绑定到纹理(我猜错了就在这里) cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc();//cudaCreateChannelDesc(32, 0, 0, 0, cudaChannelFormatKindFloat); cudaArray *d_cuArr; cudaMalloc3DArray(&d_cuArr, &channelDesc, make_cudaExtent(SizeNoise,SizeNoise,SizeNoise), 0); cudaMemcpy3DParms copyParams = {0}; //Loop for every separated Noise Texture (nNoise = 4) […]

尝试一起编译多个CUDA文件时链接错误LNK2005

我有一个工作正常的CUDA程序,但目前所有程序都写在一个文件中。 我想将这个大文件拆分成几个较小的文件,以便更容易维护和导航。 新结构是: foo.cuh foo.cu bar.cuh bar.cu main.cu .cuh头文件包含结构和函数原型, .cu文件包含函数定义(像往常一样)。 主文件包括bar.cuh , bar.cu包括foo.cuh 。 所有.cu文件都包含cutil_inline.h,以便能够使用CUDA函数。 因此: // main.cu #include “bar.cuh” #include int main() […] // bar.cu #include “bar.cuh” #include “foo.cuh” #include […] // foo.cu #include “foo.cuh” #include […] 问题是当我用这个新结构编译我的Visual Studio 2008项目时,我遇到了大量的链接错误: error LNK2005: “void __cdecl __cutilBankChecker(unsigned int,unsigned int,unsigned int,unsigned int,unsigned int,unsigned int,char *,int,char *,int)” (?__cutilBankChecker@@YAXIIIIIIPADH0H@Z) […]

复制跨步数据(往返于CUDA设备)的有效方法?

是否有可能有效地将由恒定(或甚至非常数)值跨越的数据复制到CUDA设备和从CUDA设备复制? 我想对角化一个大的对称矩阵。 使用jacobi算法,在每次迭代中使用两行和两列进行一系列操作。 由于Matrix本身太大而无法完全复制到设备,因此我正在寻找将两行和两列复制到设备的方法。 使用三角矩阵forms存储数据会很好,但还有其他缺点 非恒定行长[不是那种问题] 列值的非恒定步幅[每行的步幅增加1。] 出现。 [编辑:即使使用三角形,仍然无法将整个Matrix存储在GPU上。] 我查看了一些时间并认识到逐个复制跨步值非常慢(同步和异步)。 //编辑:删除解决方案 – 添加了答案

需要随机访问时改善随机存储器访问

我正在做的基本概念 完成联盟结构形成问题/组合拍卖。 给定一组N个代理,其中该代理集的不相交子集产生最佳结果。 例如, Agents = {a,b}及其值 {a} = 2 {b} = 3 {a,b} = 4 在这种情况下, {{a},{b}} = 5的联盟将给出最佳结果,其中它是{a,b}的成对不相交子集。 因此,简而言之,问题在于拆分集合并检查任何拆分总和是否大于原始集合。 (这部分与生成分裂以及如何表示数据一样好。) 我如何表示数据基本上是一个值数组,其中索引是设置配置(一个集合表示为整数)。 对于上面的例子: int val[4] = {0,2,3,4}其中set {a} = 01 = index 1 {b} = 10 = index 2 {a,b} = 11 = index 3 因此该集合充当值数组中的索引。 问题在于,这给出了随机存储器访问,给定了大量需要考虑2^n值的代理。 跳过这里的记忆访问问题 例如,在20个代理的环境中,给定两个元素10000000000000000001的集合,元素10000000000000000001的值是远离00000000000000000001的1048575个索引,其在内存中是4194300个字节,其表示32767个128字节距离的cachlines。 因此,可怕的访问模式。 我试过寻找的解决方案涉及按基数/汉明重量排序索引: 基于汉明重量的索引 确定两个整数之间的字典距离 遭受算术开销,我的计算将掩盖随机访问的惩罚。 […]

OpenCL或CUDA走哪条路?

我正在研究使用GPU来处理流数据的方法。 我有两个选择,但无法决定走哪条路? 我的标准如下: 易于使用(良好的API) 社区和文件 性能 未来 我将在linux下用C和C ++编写代码。

像(void **)和device_array这样的转换有什么问题?

关于使用cudaMalloc((void**)&device_array, num_bytes)另一个问题有这个答案 ,它使用void**作为输出参数,而不是像标准malloc那样传递void*作为返回值。 它批评了NVIDIA的API并声明: 如(void **)和device_array中的转换是无效的C并导致未定义的行为。 并且已被多次投票(截至目前为8),因此我认为其中有一些道理。 我不明白在那里投掷有什么问题。 什么是无效的C? 在什么情况下会导致未定义的行为? 我所知道的是,它在没有警告的情况下进行编译,并以我的预期行为运行。 但是我不了解C达到标准规格水平。

使用CUDA在本地内存中的数组上定义变量大小

是否有可能在设备函数中创建列表,数组,列表/数组的大小,以及调用中的参数…或者在调用时初始化的全局变量? 我想像这些列表中的一个工作: unsigned int size1; __device__ void function(int size2) { int list1[size1]; int list2[size2]; } 是否有可能做一些聪明的事情来做这样的工作?

__forceinline__对CUDA C __device__函数的影响

关于何时使用内联函数以及何时在常规C编码中避免它,有很多建议。 __forceinline__对CUDA C __device__函数有什么影响? 应该在哪里使用以及在哪里避免?