我在使用cuda理解NVIDIA gpu架构中的线程时遇到了一些麻烦.
请任何人澄清这些信息:一个8800 gpu有16个SM,每个有8个SP.所以我们有128个SP.
我正在观看斯坦福的视频演示,并且说每个SP都能够在当前运行96个线程.这是否意味着它(SP)可以同时运行96/32 = 3个warp?
此外,由于每个SP可以运行96个线程,并且每个SM都有8个SP.这是否意味着每个SM可以同时运行96*8 = 768个线程?但是如果每个SM一次只能运行一个Block,并且一个块中的最大线程数是512,那么同时运行768个线程并且最多有512个线程的目的是什么?
一个更普遍的问题是:如何将块,线程和warp分配给SM和SP?我读到每个SM一次只能执行一个块,块中的线程被分成warp(32个线程),SP执行warp.
我正在尝试在rootbeer库中运行第一个示例,您可以从此处找到它.
问题是,即使我按照他们的所有说明操作,当我尝试运行Jar时,我收到以下消息
root@ubuserver3:/home/ubuadmin/JavaJars/HelloWordGPU# java -jar HelloWorldGPU.jar
OpenJDK Client VM warning: You have loaded library /usr/lib/libcuda.so.319.37 which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
Exception in thread "main" java.lang.NullPointerException
at org.trifort.rootbeer.runtime.Rootbeer.run(Rootbeer.java:104)
at ScalarMult.test(ScalarMult.java:13)
at Main.main(Main.java:17)
Run Code Online (Sandbox Code Playgroud)
我不是Linux人员,所以我不明白如何正确执行此命令.我也不明白它们的意思是什么,因为这是我第一次使用GPU编程.但我知道用错误的命令搞乱GPU是一个问题.
任何人都可以对输出有所了解intel_gpu_top吗?具体来说,什么是任务GAM,VS等(手册页没什么帮助.)
比特流忙什么意思?它似乎总是零......
render busy: 45%: ????????? render space: 83/131072
bitstream busy: 0%: bitstream space: 0/131072
blitter busy: 0%: blitter space: 0/131072
task percent busy
GAM: 43%: ????????? vert fetch: 0 (0/sec)
VS: 35%: ??????? prim fetch: 0 (0/sec)
CL: 33%: ??????? VS invocations: 2101845324 (1427552/sec)
SF: 33%: ??????? GS invocations: 0 (0/sec)
VF: 33%: ??????? GS prims: 0 (0/sec)
GAFS: 33%: ??????? CL invocations: 701123988 (475776/sec)
SOL: 32%: ??????? CL prims: …Run Code Online (Sandbox Code Playgroud) 下面的代码执行操作上gpuArrays相同的操作a和b在两种不同的方式.第一部分计算(a'*(a*b)')',第二部分计算a*b*a.然后验证结果是相同的.
%function test
clear
rng('default');rng(1);
a=sprand(3000,3000,0.1);
b=rand(3000,3000);
a=gpuArray(a);
b=gpuArray(b);
tic;
c1=gather(transpose(transpose(a)*transpose(a*b)));
disp(['time for (a''*(a*b)'')'': ' , num2str(toc),'s'])
clearvars -except c1
rng('default');
rng(1)
a=sprand(3000,3000,0.1);
b=rand(3000,3000);
a=gpuArray(a);
b=gpuArray(b);
tic;
c2=gather(a*b*a);
disp(['time for a*b*a: ' , num2str(toc),'s'])
disp(['error = ',num2str(max(max(abs(c1-c2))))])
%end
Run Code Online (Sandbox Code Playgroud)
但是,计算(a'*(a*b)')'速度大约是计算速度的4倍a*b*a.以下是R2018a上Nvidia K20上面脚本的输出(我尝试过不同的版本和不同的GPU,具有相似的行为).
>> test
time for (a'*(a*b)')': 0.43234s
time for a*b*a: 1.7175s
error = 2.0009e-11
Run Code Online (Sandbox Code Playgroud)
甚至更奇怪的是,如果上述脚本的第一行和最后一行是未注释的(它变成一个函数),则两个取较长的时间量(〜1.7S代替〜0.4秒).以下是此案例的输出:
>> test
time for (a'*(a*b)')': 1.717s
time for a*b*a: 1.7153s
error = 1.0914e-11
Run Code Online (Sandbox Code Playgroud)
我想知道是什么导致了这种行为,以及如何在matlab函数内而不是在脚本内部的较短时间内(即~0.4s而不是~1.7s)执行 …
在使用 Apache JMeter 进行性能测试期间,我的初始模型遇到了问题。
错误:分配形状为 [800,1280,3] 的张量并在 /job:localhost/replica:0/task:0/device:GPU:0 上通过分配器 GPU_0_bfc [[Node: Cast = CastDstT=DT_FLOAT, SrcT=DT_UINT8, _device="/job:localhost/replica:0/task:0/device:GPU:0"]] 提示:如果您想在 OOM 发生时查看已分配张量的列表,请将 report_tensor_allocations_upon_oom 添加到 RunOptions for current分配信息。
GPGPU是在视频卡上使用并行处理器以大幅提高性能的原则.
有没有人对使用OpenCL或CUDA在Delphi中使用GPGPU有任何想法?CUDA只是NVidia,但他们也采用了OpenCL"标准".
我从Google搜索中找到了一些Delphi样本,但它们要么崩溃,要么不编译/运行.
最终的指导样本将是:
在那个阶段,我可以开始研究OpenCL SDK并编写/编译DLL来从任何Delphi应用程序调用.
这种东西真的开始起飞了.Embarcadero在这个阶段不需要做任何事情(除非他们想要),但是如果有一个Delphi的教程和样本可用,那就太棒了.许多样本可用于其他语言,但我们还需要一个简单的Delphi示例来说明将Delphi用于GPGPU应用程序是多么容易.
我很想知道很长一段时间处理OpenGL FrameBuffer对象(FBO)的最佳方法.切换FBO可能成本很高,但也定义了新的附件.
你怎么快速做到的?
我在这三个之间犹豫不决:
1 FBO用于所有内容,更改附件但不要在FBO之间切换
1渲染路径中每个渲染目标(大小+格式)的FBO.这意味着我将为相似的渲染目标重用相同的FBO.但这样一种自定义模糊将花费4+ FBO.
每个渲染目标1个FBO,仅设置附件一次,然后在FBO之间切换
另外,我应该最小化FBO开关的数量(比如我最小化纹理绑定的数量)?
也许是一个疯狂的问题但是有可能在GPU上运行线程吗?
我问的原因是我有一些非常复杂的计算要执行(它主要是数学和数组),并希望看看我是否可以使用GPU获得任何速度提升.
哦,我想在C#或F#中做到这一点:)
谢谢
我在linux上使用ATI RV770显卡,OpenCl 1.0和ati-stream-sdk-v2.3-lnx64.
在运行我的主机代码时,包括以下两个部分来构建内核程序,我得到错误代码(-11)即cl_build_program_failure.这是否意味着编译了内核程序,如果没有,那么它是如何编译和调试的?
const char* KernelPath = "abc_kernel.cl"; //kernel program is in separate file but in same directory of host code..
Run Code Online (Sandbox Code Playgroud)
/ *从内核源代码创建程序对象 ******* /
char* sProgramSource = readKernelSource(KernelPath);
size_t sourceSize = strlen(sProgramSource) ;
program = clCreateProgramWithSource(context, 1,(const char **) &sProgramSource,&sourceSize, &err);
checkStatus("error while creating program",err);
Run Code Online (Sandbox Code Playgroud)
/ *构建(编译和链接)程序******* /
char* options = (char* )malloc(10*sizeof(char));
strcpy(options, "-g");
err = clBuildProgram(program, num_devices, devices_id, options, NULL, NULL);
checkStatus("Build Program Failed", …Run Code Online (Sandbox Code Playgroud) 这是我正在运行的示例MNIST代码:
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
import tensorflow as tf
sess = tf.InteractiveSession()
x = tf.placeholder(tf.float32, shape=[None, 784])
y_ = tf.placeholder(tf.float32, shape=[None, 10])
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x,W) + b)
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)
def bias_variable(shape):
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial)
def conv2d(x, W):
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
def max_pool_2x2(x):
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
strides=[1, 2, 2, 1], padding='SAME')
W_conv1 = weight_variable([5, …Run Code Online (Sandbox Code Playgroud)