小编Dou*_*oug的帖子

C中的typeof运算符

在C中是typeof,真的是运营商吗?
我在想,因为C中没有多态,在运行时没有什么可做的.也就是说,typeof的答案在编译时是已知的.(我无法想到在编译时不会知道的typeof的使用.)所以它似乎更像是一个编译时指令,而不是一个运算符.

typeof是否使用任何(处理器)运行时(在GCC中)?

c gcc typeof

44
推荐指数
4
解决办法
9万
查看次数

如何清除/删除缓存变量

试图find_path做我想做的事.

find_path(temmp include/help.h)
message("temmp= ${temmp}")
Run Code Online (Sandbox Code Playgroud)

找到help.h.输出是 temmp= /usr/local/toolA

find_path(temmp include/foo.shoe)
message("temmp= ${temmp}")
Run Code Online (Sandbox Code Playgroud)

foo.shoe不存在(未找到).输出是temmp= /usr/local/toolA 缓存变量存在,因此变量(temmp)是不变的.

我尝试用以下方法清除缓存var:

set (temmp "" CACHE INTERNAL "")
find_path(temmp include/help.h)
message("temmp= ${temmp}")
Run Code Online (Sandbox Code Playgroud)

没变.变量已清除,但仍然存在.输出是temmp= (find_path不运行.)

如何temmp从缓存中删除变量?(我想强迫它find_path再次运行.)

cmake

12
推荐指数
1
解决办法
1万
查看次数

强制CUDA使用寄存器作为变量

我的内核中有很多未使用的寄存器.我想告诉CUDA使用一些寄存器来保存一些数据,而不是每次需要时都读取全局数据.(我无法使用共享内存.)

__global__ void simple(float *gData) {
float rData[1024];
for(int i=0; i<1024; i++) {
  rData[i]=gData[i];
  }
// work on the data here
}
Run Code Online (Sandbox Code Playgroud)

编译瓦特/:NVCC -arch sm_20 --ptxas选项= -v simple.cu,我也得到
0字节堆栈帧,0字节溢出存储,0字节溢出负载
使用2个寄存器,40个字节CMEM [0]

__global__ void simple(float *gData) {
register float rData[1024];
for(int i=0; i<1024; i++) {
  rData[i]=gData[i];
  }
// work on the data here
}
Run Code Online (Sandbox Code Playgroud)

注册声明什么都不做.
0字节堆栈帧,0字节溢出存储,0字节溢出加载
使用2个寄存器,40字节cmem [0]

__global__ void simple(float *gData) {
volatile float rData[1024];
for(int i=0; i<1024; i++) {
  rData[i]=gData[i];
  }
// work on the data here
} …
Run Code Online (Sandbox Code Playgroud)

cuda

11
推荐指数
2
解决办法
2万
查看次数

没有规则来制作目标/usr/lib/someLib.so

构建用于在buntu 11.04中工作,现在在12.04中没有.

与位置有冲突someLib.so.也就是说,它正在寻找错误的位置. /usr/lib/here/someLib.so是正确的位置.

当我在ccmake中运行'c'配置cmd时,它注意到了冲突,一次.现在ccmake不再抱怨,但错误依然存在. runtime library [someLib.so] in /usr/lib may be hidden by files in: /usr/lib/here

CMakeLists.txt中导致构建错误的行是:

ADD_EXECUTABLE(test main.cpp)
TARGET_LINK_LIBRARIES(test moreStuff evenMoreStuff)
Run Code Online (Sandbox Code Playgroud)

我在build.make文件中看到了问题.这是由ccmake生成的.我想不通的地方ccmake越来越的想法,someLib.so是在/usr/lib/的,而不是@ /usr/lib/here/.我认为这将是一个SET()声明.我找不到它.

1)什么是配置文件(ccmake'c'cmd)?它会在哪里(同一个目录?)?我想如果我去它,我将能够再次看到错误.(更改CMakeFile.txt似乎没有这样做.)
2)如何找出someLib.so设置位置的位置?(我在找什么?)

我讨厌CCMAKE.谢谢

cmake

11
推荐指数
1
解决办法
2万
查看次数

cudaMemcpy()vs cudaMemcpyFromSymbol()

我想弄明白为什么cudaMemcpyFromSymbol()存在.似乎'符号'func可以做的一切,nonSymbol cmds可以做到.

符号func似乎可以轻松移动数组或索引的一部分,但这可以很容易地使用nonSymbol函数完成.我怀疑nonSymbol方法会运行得更快,因为不需要符号查找.(目前尚不清楚符号查找计算是在编译还是运行时完成.)

我为什么要用cudaMemcpyFromSymbol()vs cudaMemcpy()?

cuda

9
推荐指数
1
解决办法
3131
查看次数

CUDA:了解PTX信息

我没有找到有关PTX信息的有用信息--ptxas-options=-v 我发现2008 NVCC pdf有一个小的模糊,但没有细节.
1)什么64 bytes cmem[0], 12 bytes cmem[16]意思?我收集它指的是不断的记忆.我不在代码中使用任何常量mem,因此这必须来自编译器.(什么进入RO mem?)
2)什么49152+0 bytes smem意思?是的,它是共享内存,但这两个#是什么意思?
3)是否有一份文件可以帮助我解决这个问题?(它叫什么?)
4)我在哪里可以找到解释*.ptx文件的文档?(我希望能够阅读/理解cuda assy代码.)

cuda

8
推荐指数
1
解决办法
4250
查看次数

cudaMemset() - 它是设置字节还是整数?

来自在线文档:

cudaError_t cudaMemset (void * devPtr, int value, size_t count )
Run Code Online (Sandbox Code Playgroud)

使用常量字节值填充devPtr指向的内存区域的第一个计数字节.

参数:devPtr -指向设备存储器值-值设置每个字节指定的存储器计数-大小在字节设置

此描述似乎不正确:

int *dJunk;
cudaMalloc((void**)&dJunk, 32*(sizeof(int));
cudaMemset(dJunk, 0x12, 32);
Run Code Online (Sandbox Code Playgroud)

将所有32个整数设置为0x12,而不是0x12121212.(Int vs Byte)

描述讨论了设置字节.计数和值以字节为单位进行描述.通知计数的类型为size_t,值的类型为int.即将字节大小设置为int值.

编程指南中未提及cudaMemset().我必须假设我看到的行为是正确的,文档很糟糕.

那里有更好的文档来源吗?(在哪里?)
是否支持其他类型?即会float *dJunk;工作吗?其他?

cuda memset semantics

8
推荐指数
1
解决办法
3万
查看次数

条件syncthreads和死锁(或不)

跟进Q:EarlyExitDroppedThreads

根据以上链接,下面的代码应该是死锁.
请解释为什么这不会死锁.(费米的Cuda 5)

__device__ int add[144];
__device__ int result;

add<<<1,96>>>();  // the calling 

__global__ void add() {
 for(idx=72>>1; idx>0; idx>>=1) {
  if(thrdIdx < idx) 
   add[thrdIdx]+= add[thrdIdx+idx];
  else
   return;
  __syncthreads();
 }

 if(thrdIdx == 0)
  result= add[0];
}
Run Code Online (Sandbox Code Playgroud)

cuda

6
推荐指数
1
解决办法
1584
查看次数

块,线程,warpSize

有关如何选择#blocks和blockSize的讨论很多,但我仍然遗漏了一些东西.我的许多问题都解决了这个问题:CUDA阻止/变形/线程如何映射到CUDA核心? (为了简化讨论,有足够的perThread和perBlock内存.内存限制在这里不是问题.)

kernelA<<<nBlocks, nThreads>>>(varA,constB, nThreadsTotal);
Run Code Online (Sandbox Code Playgroud)

1)为了让SM尽可能忙,我应该设置nThreads为倍数warpSize.真正?

2)SM一次只能执行一个内核.这就是SM的所有HWcores只执行kernelA.(不是某些HWcores运行kernelA,而其他运行kernelB.)因此,如果我只有一个线程可以运行,那么我就"浪费"了其他的HWcores.真正?

3)如果warp-scheduler以warpSize(32个线程)为单位发出工作,并且每个SM有32个HWcore,则SM将被充分利用.SM有48个HWcores时会发生什么?当调度程序以32块为单位发布工作时,如何充分利用所有48个核心?(如果上一段是真的,如果调度程序以HWcore大小为单位发布工作会不会更好?)

4)看起来warp-scheduler一次排队2个任务.因此当当前正在执行的内核停止或阻塞时,第二个内核被交换.(目前尚不清楚,但我猜这里的队列深度超过2个内核.)这是正确的吗?

5)如果我的HW的上限为每块512个线程(nThreadsMax),这并不意味着具有512个线程的内核将在一个块上运行得最快.(同样,mem也不是问题.)如果我将512线程内核分布在多个块中,而不仅仅是一个块,那么我很有可能获得更好的性能.该块在一个或多个SM上执行.真正?

5a)我认为越小越好,但是我做得多小也一样重要nBlocks吗?问题是,如何选择nBlocks那个体面的价值?(不一定是最优的.)是否有选择的数学方法nBlocks,或者它只是试验性的.

cuda warp-scheduler

5
推荐指数
2
解决办法
2418
查看次数

cudaMemcpy和阻止

我对一些关于阻塞和cudaMemcpy的评论感到困惑.据我所知,Fermi HW可以同时执行内核并执行cudaMemcpy.

我读到Lib func cudaMemcpy()是一个阻塞函数.这是否意味着func将阻止进一步执行,直到副本完全完成?或者这是否意味着在先前的内核完成之前副本不会启动?

例如,此代码是否提供相同的阻止操作?

SomeCudaCall<<<25,34>>>(someData);
cudaThreadSynchronize();
Run Code Online (Sandbox Code Playgroud)

VS

SomeCudaCall<<<25,34>>>(someParam);
cudaMemcpy(toHere, fromHere, sizeof(int), cudaMemcpyHostToDevice);
Run Code Online (Sandbox Code Playgroud)

cuda

5
推荐指数
2
解决办法
4275
查看次数

标签 统计

cuda ×7

cmake ×2

c ×1

gcc ×1

memset ×1

semantics ×1

typeof ×1

warp-scheduler ×1