Tag: nvidia

无法为CUDA C程序创建工作Makefile

我有一个由3个CUDA文件和2 个头文件组成的简单脚本: main.cu , kernel.cu func.cu , kernel.h和func.h。 他们的目标是计算2个向量的总和。 // main.cu #include #include #include #include #include “kernel.h” int main(){ /* Error code to check return values for CUDA calls */ cudaError_t err = cudaSuccess; srand(time(NULL)); int count = 100; int A[count], B[count]; int *h_A, *h_B; h_A = A; h_B = B; int i; for(i=0;i<count;i++){ *(h_A+i) […]

使用CUDA-C生成索引

我想在下面生成一组索引: 我有一个cuda块,由20个块组成(blockIdx:从0到19),每个块被细分为4个块(子块Idx:0,1,2和3)。 我试图生成这样的索引模式: threadIdx(tid),SubBlockIdxA(SA),SubBlockIdxB(SB),BlockIdxA(BA),BlockIdxB(BB) Required Obtained tid SBA SBB BA BB SBA SBB BA BB 0 0 1 0 0 0 1 0 0 1 1 0 0 1 1 0 0 1 2 0 1 1 1 0 1 1 1 3 1 0 1 2 1 0 1 2 4 0 1 2 […]

OpenCL命令队列(CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE)无法正常工作(MacOS)

完成Fixstars的示例和源代码。 具体来说,我正在尝试第5章中的最后一点代码(两个移动平均线 – 又名Golden Cross): http://www.fixstars.com/en/opencl/book/OpenCLProgrammingBook/opencl-programming-practice/ 代码可在此处获得: http://www.fixstars.com/en/opencl/book/sample/ 我将在下面发布具体示例。 但缺点是通过设置命令队列如下: command_queue = clCreateCommandQueue(context, device_id, CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, &ret); 导致无效的command_queue(clError)。 因此,返回数据未得到正确处理。 IE。,它全是零。 但是,如果我设置代码只计算一个移动平均值,而没有CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE ,那么事情就可以了。 相应地,本章之前的Fixstars代码似乎都可以正常工作。 我正在开发一款配备NVIDIA芯片的全新MacBook Pro(视网膜)。 所以我想知道它是否与NVIDIA实现或其他方面有关。 无论如何,它对我来说都是一个阻碍,因为我最终试图做的是触发多个(相同的)过程,每个过程都有不同的参数,这个例子通过同时计算两个股票价格移动平均线试图做同样的事情。 代码片段如下。 我已经在其源代码中添加了调试打印输出function。 所以我在程序执行时看到以下内容: 从clGetPlatformIDs返回代码:成功! 从clGetDeviceIDs返回代码:成功! 从clCreateContext返回代码:成功! 从clCreateCommandQueue返回代码:无效的值 从clBuildProgram返回代码:成功! 从clCreateKernel返回代码(13):成功! 从clCreateKernel返回代码(26):成功! 从clEnqueueTask(13)返回代码:无效的命令队列 从clEnqueueTask(26)返回代码:无效的命令队列 结果[25]:[0](0.000000,0.000000)[0](0.000000,0.000000)[0](0.000000,0.000000)[0](0.000000,0.000000) 结果[26]:[0](0.000000,0.000000)[0](0.000000,0.000000)[0](0.000000,0.000000)[0](0.000000,0.000000) 结果[27]:[0](0.000000,0.000000)[0](0.000000,0.000000)[0](0.000000,0.000000)[0](0.000000,0.000000) 结果[28]:[0](0.000000,0.000000)[0](0.000000,0.000000)[0](0.000000,0.000000)[0](0.000000,0.000000) …其余数据也都是零。 我正在编译: gcc -O2 -c moving_average_vec4p.c gcc moving_average_vec4p.o -o moving_average_vec4p -framework opencl —-(主机代码)moving_average_vec4p.c […]

__forceinline__对CUDA C __device__函数的影响

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

CUDA C和C ++的说明

谁能给我一个关于CUDA C和C ++性质的很好的解释? 据我了解,CUDA应该是带有NVIDIA GPU库的C语言。 截至目前,CUDA C支持一些C ++function,但不支持其他function。 什么是NVIDIA的计划? 他们是否会在C上构建并添加与C ++相似的库(例如Thrust vs. STL)? 他们最终会支持所有的C ++吗? 在.cu文件中使用C ++标头是不是很糟糕?

CUDA:添加两个数字给出了错误的答案

这是该计划 #include #include #include #include __global__ void Addition(int *a,int *b,int *c) { *c = *a + *b; } int main() { int a,b,c; int *dev_a,*dev_b,*dev_c; int size = sizeof(int); cudaMalloc((void**)&dev_a, size); cudaMalloc((void**)&dev_b, size); cudaMalloc((void**)&dev_c, size); a=5,b=6; cudaMemcpy(dev_a, &a,sizeof(int), cudaMemcpyHostToDevice); cudaMemcpy(dev_b, &b,sizeof(int), cudaMemcpyHostToDevice); Addition<<>>(dev_a,dev_b,dev_c); cudaMemcpy(&c, dev_c,size, cudaMemcpyDeviceToHost); cudaFree(&dev_a); cudaFree(&dev_b); cudaFree(&dev_c); printf(“%d\n”, c); return 0; } 这是我如何编译它 […]

CUDA结果使用非常大的数组返回垃圾,但报告没有错误

我正在创建一个测试程序,它将创建一个大小为n的设备和主机数组,然后启动一个内核,创建n个线程,为设备arrays中的每个位置分配常量值0​​.95f。 完成后,将设备arrays复制到主机arrays,并汇总所有条目并显示最终总计。 下面的程序似乎适用于大约6000万个浮点数的数组大小并且很快返回正确的结果,但是当达到7000万时,程序似乎挂起了一段时间并最终返回总结果的NAN结果。 在6000万次运行后检查主机arrays显示它已正确填充0.95f,但在7000万次运行后检查它显示它填充了NAN。 据我所知,没有一个CUDA调用返回错误。 我使用的是2GB GT640m(Compute 3.0),最大块大小为1024,最大网格尺寸为2147483647。 我相信有更好的方法来实现类似的东西,我想听听建议。 但我也想了解这里出了什么问题,以便我可以从中学习。 #include “cuda_runtime.h” #include “device_launch_parameters.h” #include #include void cudaErrorHandler(cudaError_t status) { // Cuda call returned an error, just print error for now if(status != cudaSuccess) { printf(“Error”); } } __global__ void addKernel(float* _Results, int _TotalCombinations) { // Get thread Id unsigned int Id = (blockDim.x * […]

CUDA矩阵乘法中断了大型矩阵

我有以下矩阵乘法代码,使用CUDA 3.2和VS 2008实现。我在Windows server 2008 r2 enterprise上运行。 我正在运行Nvidia GTX 480.以下代码适用于“宽度”(矩阵宽度)的值高达约2500左右。 int size = Width*Width*sizeof(float); float* Md, *Nd, *Pd; cudaError_t err = cudaSuccess; //Allocate Device Memory for M, N and P err = cudaMalloc((void**)&Md, size); err = cudaMalloc((void**)&Nd, size); err = cudaMalloc((void**)&Pd, size); //Copy Matrix from Host Memory to Device Memory err = cudaMemcpy(Md, M, size, […]

CUDA上的块间障碍

我想在CUDA上实现Inter-block障碍,但遇到了严重的问题。 我无法弄清楚为什么它不起作用。 #include #include #include #define SIZE 10000000 #define BLOCKS 100 using namespace std; struct Barrier { int *count; __device__ void wait() { atomicSub(count, 1); while(*count) ; } Barrier() { int blocks = BLOCKS; cudaMalloc((void**) &count, sizeof(int)); cudaMemcpy(count, &blocks, sizeof(int), cudaMemcpyHostToDevice); } ~Barrier() { cudaFree(count); } }; __global__ void sum(int* vec, int* cache, int *sum, […]

为什么vkGetPhysicalDeviceMemoryProperties返回多个相同的内存类型?

因此,我在初始化期间收集有关我的设备的一些信息,并找到vkGetPhysicalDeviceMemoryProperties返回的唯一(或更确切地说,非常相似)内存类型集: Device Name: GeForce GTX 1060 3GB Device ID: 7170 Device Type: 2 Device Vendor ID: 4318 Device API Version: 4194369 (1.0.65) Device Driver Version: 1636843520 (390.65) Device Heaps: 0 -> Size: 3133145088 Flags: 1 1 -> Size: 8523874304 Flags: 0 Device Memory: 0 -> Index: 1 Flags: 0 1 -> Index: 1 Flags: 0 […]