我想听听有两种编码经验的人的意见.我自己,我只有NVIDIA的经验.
NVIDIA CUDA似乎比竞争对手更受欢迎.(只计算这个论坛上的问题标签,'cuda'优于'opencl'3:1,'nvidia'优于'ati '15:1,并且根本没有'ati-stream'标签.
另一方面,根据维基百科,ATI/AMD显卡应该具有更大的潜力,特别是每美元.目前市场上最快的NVIDIA显卡,GeForce 580(500美元),评级为1.6单精度TFlops.AMD Radeon 6970的售价为370美元,售价为2.7 TFlops.580具有512个执行单元,772 MHz.6970具有1536个执行单元,频率为880 MHz.
AMD相对于NVIDIA的纸张优势有多现实,是否可能在大多数GPGPU任务中实现?整数任务会发生什么?
我正在研究CPU繁重的数值计算应用程序.没有进入很多细节,它是一个计算数学研究项目,涉及为大整数x计算某个函数f(x).
现在,所有内容都是在x64模式下使用C++实现的,使用本机64位整数.这限制了我x <2 ^ 64~1.8*10 ^ 19.我想更进一步,为此,我需要一个执行128位算术的库.它必须非常快.特别是,整数除法应该很快.否则我会坐在这里等待结果直到感恩节.而且我宁愿不重新发明轮子.
我在维基百科上找到了一个大约20个大整数库的列表,但其中大多数似乎都是针对任意精度的数字,这对我的任务来说太过分了,我不需要额外的费用.
有谁知道哪个库可以最快地运行128位整数?
我正在尝试修改自定义Web服务器应用程序以使用HTML5视频.
它提供带有基本<video>标记的HTML5页面,然后它需要处理实际内容的请求.
到目前为止,我能让它工作的唯一方法是将整个视频文件加载到内存中,然后在一个响应中将其发回.这不是一个实用的选择.我想逐件服务:发送回来,比方说,100 kb,等待浏览器请求更多.
我看到一个带有以下标题的请求:
http_version = 1.1
request_method = GET
Host = ###.###.###.###:##
User-Agent = Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0
Accept = video/webm,video/ogg,video/*;q=0.9,application/ogg;q=0.7,audio/*;q=0.6,*/*;q=0.5
Accept-Language = en-US,en;q=0.5
Connection = keep-alive
Range = bytes=0-
Run Code Online (Sandbox Code Playgroud)
我试图发回部分内容回复:
HTTP/1.1 206 Partial content
Content-Type: video/mp4
Content-Range: bytes 0-99999 / 232725251
Content-Length: 100000
Run Code Online (Sandbox Code Playgroud)
我得到了一些GET请求,如下所示
Cache-Control = no-cache
Connection = Keep-Alive
Pragma = getIfoFileURI.dlna.org
Accept = */*
User-Agent = NSPlayer/12.00.7601.17514 WMFSDK/12.00.7601.17514
GetContentFeatures.DLNA.ORG = 1
Host = ###.###.###.###:##
Run Code Online (Sandbox Code Playgroud)
(没有迹象表明浏览器需要文件的任何特定部分.)无论我发送回浏览器,视频都不会播放.
如上所述,如果我尝试在同一HTTP数据包中一次发送整个230 MB文件,则相同的视频将正常播放.
有没有办法让这一切都通过部分内容请求很好地工作?我正在使用Firefox进行测试,但它最终需要与所有浏览器一起使用.
我有一个生成数据的大循环.每次迭代需要1秒钟,然后产生一大块数据.我需要以正确的顺序写入文件的所有块.
如果我只想并行化循环,我可以写这样的东西(高度简化):
FILE* f = fopen("output.txt", "w");
omp_lock_t lock;
omp_init_lock(&lock);
int nIterations = 1000000;
#pragma omp parallel for
for(int thread=0; thread<4; thread++)
{
int a=0, b=0, c=0;
for(int n=thread; n<nIterations; n+=4)
{
int value = do_computations(&a, &b, &c);
omp_set_lock(&lock);
fprintf(f, "%d\n", value);
omp_unset_lock(&lock);
}
}
#pragma omp barrier
fclose(f);
omp_destroy_lock(&lock);
Run Code Online (Sandbox Code Playgroud)
这会将我的输出输入到文件中,但不保证条目的顺序.
我想同步执行,以便所有线程完成他们的任务,然后主线程写入文件,然后线程恢复.换句话说,我想要这样的事情:
#pragma omp parallel for
for(int thread=0; thread<4; thread++)
{
int a=0, b=0, c=0;
int values[4];
for(int n=thread; n<nIterations; n+=4)
{
values[n] = do_computations(&a, &b, &c);
#pragma omp barrier …Run Code Online (Sandbox Code Playgroud) 我想知道最近修订的 C++ 标准中是否有任何内容可以让我构造一个向量,并用最少的击键(最好是在一行中)用自动生成的值(例如,来自 RNG)填充它。
我能想到的最好的是
int N=1000;
std::default_random_engine rng;
std::uniform_int_distribution<int> distr(0,99);
vector<int> v(N);
std::generate(v.begin(), v.end(), std::bind(distr,rng));
Run Code Online (Sandbox Code Playgroud)
或者
std::generate_n(v.begin(), N, std::bind(distr,rng));
Run Code Online (Sandbox Code Playgroud)
但它太长了,实际上需要更少的击键来编写显式初始化循环:
for(auto& x: v)
x=distr(rng);
Run Code Online (Sandbox Code Playgroud)
我特别不喜欢那里有 .begin() 和 .end() 。
似乎没有正确的向量构造函数能够采用函子初始值设定项,但也许还有其他方法。
TensorFlow在单个张量上长期存在2 Gb的限制。这意味着您不能一次跳过超过2 Gb的数据来训练模型。请参见使用大于2GB的数组初始化tensorflow变量; 在Tensorflow中使用大型数据集
这些帖子中引用的标准解决方案是使用占位符,并将其通过feed_dict传递给“会话”:
my_graph = tf.Graph()
sess = tf.Session(graph=my_graph)
X_init = tf.placeholder(tf.float32, shape=(m_input, n_input))
X = tf.Variable(X_init)
sess.run(tf.global_variables_initializer(), feed_dict={X_init: data_for_X})
Run Code Online (Sandbox Code Playgroud)
但是,这仅在我使用“旧” API(tf.Session()等)时才有效。如今,推荐的方法是使用Keras(tensorflow.org上的所有教程都使用它)。而且,对于Keras,没有tf.Graph(),tf.Session()和run()(至少没有一个用户容易看到的)。
如何修改以上代码以与Keras配合使用?