可以的
【 在 zhongxue 的大作中提到: 】
: 普通的3.5的sata盘能用不 ...
可以的
【 在 zhongxue 的大作中提到: 】
: 普通的3.5的sata盘能用不 ...
自己买显卡装就行了 英伟达加速卡太贵了 不适合这个平台
【 在 citihome 的大作中提到: 】
: 没英伟达的加速卡?
https://market.m.taobao.com/app/idleFish-F2e/widle-taobao-rax/page-detail?wh_weex=true&wx_navbar_transparent=true&id=633325427931&ut_sk=1.XwpzcR24zb4DAHfKKyX07gu0_21407387_1609211093121.Copy.detail.633325427931.71874216&forceFlush=1
32g内存 20核 送120gssd 17寸显示器 gpu供电套件 便宜出了
比较适用于深度学习场景, 有4个PCIx16, 但有一个要插整列卡, 所以只能插3个GPU, 不带硬盘, 带阵列卡, GPU电源套件, 750w单电, 机架式机箱(没有导轨) 有意者联系, 6500吧
https://github.com/matazure/mtensor 大家好,给大家推荐一个我的开源项目, 支持cuda的延迟计算的
https://github.com/matazure/mtensor/blob/master/test/view/ut_permute.hpp 可以看下我写的开源库mtensor,
【 在 fangniuwawa 的大作中提到: 】
: 对张量指标轮换的操作。谢谢!
https://github.com/matazure/dicom.js, http://dicomjs.matazure.com/dicomjs/examples/demo.html 开源一个基于webgl的dicom阅片,容易拓展修改
会借鉴xtensor的一些东西 我这写得比xtensor早很多很多年 很早之前代码是放在coding.net上的
【 在 mvtec 的大作中提到: 】
: 不就是expression template
: 吗
: 另外
: ...................
mtensor支持cuda版本的, 并且灵活很多, 可以通过定义lambda算子注入表达式, Eigen如果要拓展它没有的需要实现一个繁琐的模板表达式的
【 在 leslin 的大作中提到: 】
: 哦就是延迟求值啊,这个eigen不也是这样么
https://zh.wikipedia.org/wiki/%E6%83%B0%E6%80%A7%E6%B1%82%E5%80%BC
延迟计算在创建一个矩阵的时候不并具体的去计算他的元素值,而是把计算的方式记录在这个矩阵里, 当我访问到具体的元素时候,再根据坐标去计算元素值。
计算的方式其实就是一个 函数(算子) 其输入参数是矩阵的坐标, 输出是元素的值
【 在 leslin 的大作中提到: 】
: 什么叫延迟计算
支持CUDA gpu的延迟计算, 但没有Eigen的数值计算,
延迟计算的实现更简洁,更灵活。 更加专注多维数组的延迟计算
【 在 xieyf 的大作中提到: 】
: 跟eigen相比有什么特色?
大家好,
向大家推荐一个我自己写的延迟计算库, 支持多维数组数据结构,并且支持CUDA
https://github.com/matazure/mtensor
mtensor是一个支持延迟计算的多维数组计算库, 同时支持C++和CUDA平台
基本功能
Tensor主要用于多维数组及其计算,其可以便利高效的在CPU/GPU上实现遍历,滤波,转换等多种操作。也便于数据在CPU与GPU之间的传输交互。Tensor提供以下核心功能
支持CPU和GPU端的tensor,lambda_tensor等的多维数组
支持CPU和GPU端的延迟计算技术
包含基本的fill, for_each, copy, transform等算法
基于延迟计算,在view名字空间下实现了crop, stride, clamp, slice等算子
示例
基本用法
Tensor会提供泛型多维数组的数据结构及相应的算法,其遵行Modern C++的编程风格
#include <mtensor.hpp>
using namespace matazure;
int main(int argc, char *argv[]) {
constexpr int rank = 2;
int col = 10;
int row = 5;
pointi<rank> shape{col, row};
tensor<float, rank> ts(shape);
// ts是关于2维坐标的赋值函数
auto ts_setter = [ts](pointi<rank> index) { //ts是引用拷贝
//将ts的元素每列递增1, 每行递增10
ts(index) = index[0] + index[1] * 10;
};
//遍历shape大小的所有坐标, 默认原点是(0, 0)
for_index(ts.shape(), ts_setter);
//将ts的元素按行输出
for (int j = 0; j < row; ++j) {
for (int i = 0; i < col; ++i) {
pointi<rank> index = {i, j};
std::cout << ts(index) << ", ";
}
std::cout << std::endl;
}
return 0;
}
延迟计算
我们使用Lambda Tensor来延迟计算技术,Lambda Tensor是一个抽象的多维数组,该数组不会指向具体的存储而是通过一个关于坐标的函数(算子)来描述。
#include <mtensor.hpp>
using namespace matazure;
int main(int argc, char *argv[]) {
//定义一个lambda算子用来描述抽象的一维数组, 其元素值等于坐标
auto functor_a = [](int i) -> int {
return i;
};
//lambda_tensor不仅需要算子, 也需要尺寸
pointi<1> shape = { 100 };
//构造lts_a, 其是一个lambda_tensor
auto lts_a = make_lambda(shape, functor_a);
//构造lts_b, 其元素值等于坐标的两倍
auto functor_b = [] (int i) -> int{
return i * 2;
};
auto lts_b = make_lambda(shape, functor_b);
//构造lts_a加lts_b的lambda_tensor
auto functor_add = [lts_a, lts_b] (int i) -> int {
return lts_a[i] + lts_b[i];
};
auto lts_a_add_b = make_lambda(shape, functor_add);
//上述的定义不会执行具体的运算,当我们去获取某一个具体坐标的值时其才会真正的去调用对应的算子
std::cout << "offset 50 value is " << lts_a_add_b[50] << std::endl;
}
基于GPU的并行计算
#include <iostream>
#include <mtensor.hpp>
using namespace matazure;
int main(int argc, char *argv[]) {
pointi<2> shape {5, 5};
tensor<float, 2> ts_a(shape);
tensor<float, 2> ts_b(shape);
tensor<float, 2> ts_c(shape);
fill(ts_a, 1.0f);
fill(ts_b, 2.0f);
//构造gpu上的tensor
cuda::tensor<float, 2> cts_a(shape);
cuda::tensor<float, 2> cts_b(shape);
cuda::tensor<float, 2> cts_c(shape);
//将cpu上的数据拷贝到gpu上
mem_copy(ts_a, cts_a);
mem_copy(ts_b, cts_b);
//在gpu上执行加法操作,这里使用了__device__ lambda, 需要加上nvcc的编译参数--expt-extended-lambda,
cuda::for_index(shape, [cts_a, cts_b, cts_c] __device__ (pointi<2> index) {
cts_c(index) = cts_a(index) + cts_b(index);
});
//阻塞等待执行完毕, 这是必须的
//将gpu上数据拷贝会cpu
mem_copy(cts_c, ts_c);
//打印输出
for_each(ts_c, [](float e) {
printf("%f, ", e);
});
printf("/n");
return 0;
}
sample下有更多的示例可供参考
邮箱 p3.1415@qq.com
微信 zhangzhimin-tju