Tag: cuda

如何在CUDA中使用uint4向量正确转换全局内存数组以增加内存吞吐量?

通常有两种技术可以在计算能力1.3 GPU上增加CUDA内核上全局内存的内存吞吐量。 内存访问合并并访问至少4个字节的字。 利用第一种技术,通过相同半翘曲的线程对相同存储器段的访问被合并为更少的事务,而在访问至少4字节的字时,该存储器段有效地从32字节增加到128。 更新:基于talonmies回答的解决方案 。 当存在全局存储器中存在无符号字符时,要访问16字节而不是1字节字,通常通过将存储器arrays转换为uint4来使用uint4向量。 要从uint4向量中获取值,可以将其重新编译为uchar4,如下所示: #include #include #include __global__ void kernel ( unsigned char *d_text, unsigned char *d_out ) { int idx = blockIdx.x * blockDim.x + threadIdx.x; extern __shared__ unsigned char s_array[]; uint4 *uint4_text = reinterpret_cast(d_text); uint4 uint4_var; //memory transaction uint4_var = uint4_text[0]; //recast data to uchar4 uchar4 c0 = *reinterpret_cast(&uint4_var.x); […]

CUDA Primes Generation

当数据大小增加超过260k时,我的CUDA程序停止工作(它什么都不打印)。 有人能告诉我为什么会这样吗? 这是我的第一个CUDA计划。 如果我想要更大的素数,如何在CUDA上使用大于long long int的数据类型? 显卡是GT425M。 #include #include #include #define SIZE 250000 #define BLOCK_NUM 96 #define THREAD_NUM 1024 int data[SIZE]; __global__ static void sieve(int *num,clock_t* time){ const int tid = threadIdx.x; const int bid = blockIdx.x; int tmp=bid*THREAD_NUM+tid; if(tid==0) time[bid] = clock(); while(tmp<SIZE){ int i=1; while(((2*tmp+3)*i+tmp+1)<SIZE){ num[(2*tmp+3)*i+tmp+1] = 0; i++; } tmp+=BLOCK_NUM*THREAD_NUM; } if(tid==0) […]

CUDA – Eratosthenes筛分为部分

我在GPU上编写了Eratosthenes的Sieve( https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes )的实现。 但不是这样的 – http://developer-resource.blogspot.com/2008/07/cuda-sieve-of-eratosthenes.html 方法: 创建具有默认值0/1(0 – prime,1 – no)的n元素数组并将其传递给GPU(我知道它可以直接在内核中完成,但在这一刻它不是问题)。 块中的每个线程检查单个数字的倍数。 每个块检查总sqrt(n)的可能性。 每个块==不同的间隔。 将倍数标记为1并将数据传递回主机。 码: #include #include #define THREADS 1024 __global__ void kernel(int *global, int threads) { extern __shared__ int cache[]; int tid = threadIdx.x + 1; int offset = blockIdx.x * blockDim.x; int number = offset + tid; cache[tid – 1] = […]

使用CUBLAS查找最大值和最小值

我在掌握为什么我的函数在使用CUBLAS的双精度范围内找到最大值和最小值时无法正常工作时遇到问题。 代码如下: void findMaxAndMinGPU(double* values, int* max_idx, int* min_idx, int n) { double* d_values; cublasHandle_t handle; cublasStatus_t stat; safecall( cudaMalloc((void**) &d_values, sizeof(double) * n), “cudaMalloc (d_values) in findMaxAndMinGPU”); safecall( cudaMemcpy(d_values, values, sizeof(double) * n, cudaMemcpyHostToDevice), “cudaMemcpy (h_values > d_values) in findMaxAndMinGPU”); cublasCreate(&handle); stat = cublasIdamax(handle, n, d_values, sizeof(double), max_idx); if (stat != CUBLAS_STATUS_SUCCESS) printf(“Max failed\n”); […]

CUDA __device__未解析的外部函数

我试图了解如何在单独的头文件中解耦CUDA __device__代码。 我有三个文件。 文件:1:int2.cuh #ifndef INT2_H_ #define INT2_H_ #include “cuda.h” #include “cuda_runtime.h” #include “device_launch_parameters.h” __global__ void kernel(); __device__ int k2(int k); int launchKernel(int dim); #endif /* INT2_H_ */ 文件2:int2.cu #include “int2.cuh” #include “cstdio” __global__ void kernel() { int tid = threadIdx.x; printf(“%d\n”, k2(tid)); } __device__ int k2(int i) { return i * i; } int […]

如何使用CUDA执行struct的深度复制?

使用CUDA编程我在尝试将一些数据从主机复制到gpu时遇到了问题。 我有3个这样的嵌套结构: typedef struct { char data[128]; short length; } Cell; typedef struct { Cell* elements; int height; int width; } Matrix; typedef struct { Matrix* tables; int count; } Container; 所以Container “包含”一些Matrix元素,而这些元素又包含一些Cell元素。 假设我以这种方式动态分配主机内存: Container c; c.tables = malloc(20 * sizeof(Matrix)); for(int i = 0;i<20;i++){ Matrix m; m.elements = malloc(100 * sizeof(Cell)); c.tables[i] = m; […]

CUDA错误消息:未指定的启动失败

这是我的CUDA代码的一部分。 但是这段代码的最后一部分说明了一些错误信息。 unsigned int *mat_count; off_t *mat_position; unsigned int *matches_count; off_t *matches_position; …… cudaMalloc ( (void **) &mat_count, sizeof(unsigned int)*10); cudaMalloc ( (void **) &mat_position, sizeof(off_t)*10); …… matches_count = (unsigned int *)malloc(sizeof(unsigned int)*10); matches_position = (off_t *)malloc(sizeof(off_t)*10); for ( i = 0 ; i < 10 ; i++ ) { matches_count [i] = 0; matches_position[i] […]

CUDA C和C ++的说明

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

使用GPU随机数

我正在研究使用nvidia GPU进行蒙特卡罗模拟。 但是,我想使用gsl随机数生成器以及并行随机数生成器,如SPRNG。 有谁知道这是否可能? 更新 我使用GPU玩过RNG。 目前还没有一个很好的解决方案。 SDK附带的Mersenne Twister并不适合(我的)Monte-Carlo模拟,因为生成种子需要相当长的时间。 NAG库更有前途。 您可以批量生成RN,也可以在单个线程中生成RN。 但是,目前仅支持少数分布 – Uniform,exponential和Normal。

pyCUDA与C的性能差异?

我是CUDA编程的新手,我想知道如何将pyCUDA的性能与简单C中实现的程序进行比较。性能大致相同吗? 我应该注意哪些瓶颈? 编辑:我显然首先尝试谷歌这个问题,并惊讶于没有找到任何信息。 即我会排除pyCUDA人在他们的常见问题解答中回答这个问题。