- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
全部:
我正在学习共享内存如何加速 GPU 编程过程。我正在使用下面的代码来计算每个元素的平方值加上其左右邻居的平均值的平方值。代码运行起来,结果不是预期的。
打印出的前 10 个结果是 0、1、2、3、4、5、6、7、8、9,而我期望的结果是 25、2、8、18、32、50、72 ,98,128,162;
代码如下,引用here ;
你能告诉我哪里出了问题吗?非常感谢您的帮助。
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <cuda.h>
const int N=1024;
__global__ void compute_it(float *data)
{
int tid = threadIdx.x;
__shared__ float myblock[N];
float tmp;
// load the thread's data element into shared memory
myblock[tid] = data[tid];
// ensure that all threads have loaded their values into
// shared memory; otherwise, one thread might be computing
// on unitialized data.
__syncthreads();
// compute the average of this thread's left and right neighbors
tmp = (myblock[tid>0?tid-1:(N-1)] + myblock[tid<(N-1)?tid+1:0]) * 0.5f;
// square the previousr result and add my value, squared
tmp = tmp*tmp + myblock[tid]*myblock[tid];
// write the result back to global memory
data[tid] = myblock[tid];
__syncthreads();
}
int main (){
char key;
float *a;
float *dev_a;
a = (float*)malloc(N*sizeof(float));
cudaMalloc((void**)&dev_a,N*sizeof(float));
for (int i=0; i<N; i++){
a [i] = i;
}
cudaMemcpy(dev_a, a, N*sizeof(float), cudaMemcpyHostToDevice);
compute_it<<<N,1>>>(dev_a);
cudaMemcpy(a, dev_a, N*sizeof(float), cudaMemcpyDeviceToHost);
for (int i=0; i<10; i++){
std::cout<<a [i]<<",";
}
std::cin>>key;
free (a);
free (dev_a);
最佳答案
内核代码中最直接的问题之一是:
data[tid] = myblock[tid];
我想你可能是这个意思:
data[tid] = tmp;
此外,您将启动 1024 个 block ,每个 block 一个线程。这不是一种使用 GPU 的特别有效的方法,它意味着每个线程 block 中的 tid
变量都是 0(而且只有 0,因为每个线程 block 只有一个线程。)
这种方法存在很多问题,但这里会遇到一个直接的问题:
tmp = (myblock[tid>0?tid-1:(N-1)] + myblock[tid<31?tid+1:0]) * 0.5f;
由于 tid
始终为零,因此共享内存数组 (myblock
) 中没有其他值被填充,所以这一行中的逻辑是不合理的。当 tid
为零时,您选择 myblock[N-1]
作为分配给 tmp
的第一项,但是 myblock [1023]
永远不会填充任何东西。
看来你不了解各种CUDA层次结构:
__synchthreads()
也在线程 block 基础上运行(不是设备范围的)threadIdx.x
是一个内置变量,它为线程 block 中的所有线程提供唯一的线程 ID,但不是全局地跨网格。相反,您应该将您的问题分解为大小合理的线程 block 组(即多个线程)。然后每个线程 block 将能够以大致如您所概述的方式运行。然后,您需要对每个线程 block 的起点和终点(在您的数据中)的行为进行特殊处理。
你也没做对 cuda error checking这是推荐的,尤其是在您遇到 CUDA 代码问题时。
如果您在内核代码中进行了我首先指出的更改,并颠倒了 block 和网格内核启动参数的顺序:
compute_it<<<1,N>>>(dev_a);
正如 Kristof 所说,我认为您会得到接近您想要的东西。但是,如果不对您的代码进行其他更改,您将无法方便地将其扩展到 N=1024 以上。
这行代码也不正确:
free (dev_a);
因为 dev_a
是使用 cudaMalloc
在设备上分配的,所以你应该像这样释放它:
cudaFree (dev_a);
关于c++ - CUDA 共享内存编程不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19864792/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!